దృఢమైన మరియు నిర్వహించదగిన కోడ్ కోసం టైప్ భద్రతను ఉపయోగించి అధునాతన టైప్స్క్రిప్ట్ పరీక్ష వ్యూహాలను అన్వేషించండి. విశ్వసనీయ పరీక్షలను రూపొందించడానికి రకాలను ఎలా ఉపయోగించాలో తెలుసుకోండి.
TypeScript Testing: Type-Safe Test Implementation Strategies for Robust Code
సాఫ్ట్వేర్ అభివృద్ధి రంగంలో, కోడ్ నాణ్యతను నిర్ధారించడం చాలా ముఖ్యం. టైప్స్క్రిప్ట్, దాని బలమైన టైపింగ్ సిస్టమ్తో, మరింత విశ్వసనీయమైన మరియు నిర్వహించదగిన అప్లికేషన్లను రూపొందించడానికి ఒక ప్రత్యేకమైన అవకాశాన్ని అందిస్తుంది. ఈ ఆర్టికల్ వివిధ టైప్స్క్రిప్ట్ పరీక్ష వ్యూహాలను పరిశీలిస్తుంది, బలమైన మరియు సమర్థవంతమైన పరీక్షలను రూపొందించడానికి టైప్ భద్రతను ఎలా ఉపయోగించాలో నొక్కి చెబుతుంది. మేము విభిన్న పరీక్షా విధానాలు, ఫ్రేమ్వర్క్లు మరియు ఉత్తమ పద్ధతులను అన్వేషిస్తాము, టైప్స్క్రిప్ట్ పరీక్షకు మీకు సమగ్ర మార్గదర్శిని అందిస్తాము.
Why Type Safety Matters in Testing
పరీక్షలో టైప్స్క్రిప్ట్ యొక్క స్టాటిక్ టైపింగ్ సిస్టమ్ అనేక ప్రయోజనాలను అందిస్తుంది:
- Early Error Detection: టైప్స్క్రిప్ట్ అభివృద్ధి సమయంలో టైప్-సంబంధిత ఎర్రర్లను గుర్తించగలదు, ఇది రన్టైమ్ వైఫల్యాల సంభావ్యతను తగ్గిస్తుంది.
- Improved Code Maintainability: రకాలు కోడ్ను సులభంగా అర్థం చేసుకోవడానికి మరియు రిఫ్యాక్టర్ చేయడానికి సహాయపడతాయి, ఇది మరింత నిర్వహించదగిన పరీక్షలకు దారితీస్తుంది.
- Enhanced Test Coverage: టైప్ సమాచారం మరింత సమగ్రమైన మరియు లక్ష్యంగా చేసుకున్న పరీక్షల సృష్టికి మార్గనిర్దేశం చేస్తుంది.
- Reduced Debugging Time: రన్టైమ్ ఎర్రర్లతో పోలిస్తే టైప్ ఎర్రర్లను నిర్ధారించడం మరియు పరిష్కరించడం సులభం.
Testing Levels: A Comprehensive Overview
సమగ్రమైన కవరేజీని నిర్ధారించడానికి బలమైన పరీక్షా వ్యూహంలో బహుళ స్థాయి పరీక్షలు ఉంటాయి. ఈ స్థాయిలు ఉన్నాయి:
- Unit Testing: వ్యక్తిగత భాగాలు లేదా ఫంక్షన్లను విడిగా పరీక్షించడం.
- Integration Testing: విభిన్న యూనిట్లు లేదా మాడ్యూళ్ల మధ్య పరస్పర చర్యను పరీక్షించడం.
- End-to-End (E2E) Testing: వినియోగదారు దృక్పథం నుండి మొత్తం అప్లికేషన్ వర్క్ఫ్లోను పరీక్షించడం.
Unit Testing in TypeScript: Ensuring Component-Level Reliability
Choosing a Unit Testing Framework
టైప్స్క్రిప్ట్ కోసం అనేక ప్రసిద్ధ యూనిట్ టెస్టింగ్ ఫ్రేమ్వర్క్లు అందుబాటులో ఉన్నాయి, వీటితో సహా:
- Jest: మోకింగ్, కోడ్ కవరేజ్ మరియు స్నాప్షాట్ టెస్టింగ్ వంటి అంతర్నిర్మిత ఫీచర్లతో కూడిన సమగ్ర పరీక్షా ఫ్రేమ్వర్క్. ఇది ఉపయోగించడానికి సులభమైనది మరియు అద్భుతమైన పనితీరుకు ప్రసిద్ధి చెందింది.
- Mocha: ఒక ఫ్లెక్సిబుల్ మరియు ఎక్స్టెన్సిబుల్ టెస్టింగ్ ఫ్రేమ్వర్క్, దీనికి అసెర్షన్ మరియు మోకింగ్ వంటి ఫీచర్ల కోసం అదనపు లైబ్రరీలు అవసరం.
- Jasmine: శుభ్రమైన మరియు చదవగలిగే సింటాక్స్తో కూడిన మరొక ప్రసిద్ధ పరీక్షా ఫ్రేమ్వర్క్.
ఈ కథనం కోసం, మేము దాని సరళత మరియు సమగ్ర లక్షణాల కోసం ప్రధానంగా జెస్ట్ను ఉపయోగిస్తాము. అయితే, చర్చించిన సూత్రాలు ఇతర ఫ్రేమ్వర్క్లకు కూడా వర్తిస్తాయి.
Example: Unit Testing a TypeScript Function
డిస్కౌంట్ మొత్తాన్ని లెక్కించే క్రింది టైప్స్క్రిప్ట్ ఫంక్షన్ను పరిగణించండి:
// src/discountCalculator.ts
export function calculateDiscount(price: number, discountPercentage: number): number {
if (price < 0 || discountPercentage < 0 || discountPercentage > 100) {
throw new Error("Invalid input: Price and discount percentage must be non-negative, and discount percentage must be between 0 and 100.");
}
return price * (discountPercentage / 100);
}
జెస్ట్ను ఉపయోగించి ఈ ఫంక్షన్ కోసం మీరు యూనిట్ పరీక్షను ఎలా వ్రాయవచ్చు:
// test/discountCalculator.test.ts
import { calculateDiscount } from '../src/discountCalculator';
describe('calculateDiscount', () => {
it('should calculate the discount amount correctly', () => {
expect(calculateDiscount(100, 10)).toBe(10);
expect(calculateDiscount(50, 20)).toBe(10);
expect(calculateDiscount(200, 5)).toBe(10);
});
it('should handle zero discount percentage correctly', () => {
expect(calculateDiscount(100, 0)).toBe(0);
});
it('should handle 100% discount correctly', () => {
expect(calculateDiscount(100, 100)).toBe(100);
});
it('should throw an error for invalid input (negative price)', () => {
expect(() => calculateDiscount(-100, 10)).toThrowError("Invalid input: Price and discount percentage must be non-negative, and discount percentage must be between 0 and 100.");
});
it('should throw an error for invalid input (negative discount percentage)', () => {
expect(() => calculateDiscount(100, -10)).toThrowError("Invalid input: Price and discount percentage must be non-negative, and discount percentage must be between 0 and 100.");
});
it('should throw an error for invalid input (discount percentage > 100)', () => {
expect(() => calculateDiscount(100, 110)).toThrowError("Invalid input: Price and discount percentage must be non-negative, and discount percentage must be between 0 and 100.");
});
});
టైప్స్క్రిప్ట్ యొక్క టైప్ సిస్టమ్ సరైన డేటా రకాలు ఫంక్షన్కు పంపబడతాయని మరియు అంచు కేసులు మరియు ఎర్రర్ పరిస్థితులతో సహా పరీక్షలు వివిధ దృశ్యాలను కవర్ చేస్తాయని నిర్ధారించడంలో ఎలా సహాయపడుతుందో ఈ ఉదాహరణ చూపిస్తుంది.
Leveraging TypeScript Types in Unit Tests
టైప్స్క్రిప్ట్ యొక్క టైప్ సిస్టమ్ను యూనిట్ పరీక్షల యొక్క స్పష్టత మరియు నిర్వహణను మెరుగుపరచడానికి ఉపయోగించవచ్చు. ఉదాహరణకు, ఫంక్షన్ల ద్వారా తిరిగి వచ్చే వస్తువుల యొక్క ఆశించిన నిర్మాణాన్ని నిర్వచించడానికి మీరు ఇంటర్ఫేస్లను ఉపయోగించవచ్చు:
interface User {
id: number;
name: string;
email: string;
}
function getUser(id: number): User {
// ... implementation ...
return { id: id, name: "John Doe", email: "john.doe@example.com" };
}
it('should return a user object with the correct properties', () => {
const user = getUser(123);
expect(user.id).toBe(123);
expect(user.name).toBe('John Doe');
expect(user.email).toBe('john.doe@example.com');
});
`User` ఇంటర్ఫేస్ను ఉపయోగించడం ద్వారా, పరీక్ష సరైన లక్షణాలు మరియు రకాల కోసం తనిఖీ చేస్తుందని మీరు నిర్ధారిస్తారు, ఇది మరింత దృఢంగా మరియు లోపాలకు తక్కువ అవకాశం కలిగిస్తుంది.
Mocking and Stubbing with TypeScript
యూనిట్ పరీక్షలో, దాని ఆధారపడటాలను మోకింగ్ లేదా స్టబ్బింగ్ చేయడం ద్వారా పరీక్షలో ఉన్న యూనిట్ను వేరుచేయడం తరచుగా అవసరం. టైప్స్క్రిప్ట్ యొక్క టైప్ సిస్టమ్ మోక్లు మరియు స్టబ్లు సరిగ్గా అమలు చేయబడ్డాయని మరియు అవి ఆశించిన ఇంటర్ఫేస్లకు కట్టుబడి ఉన్నాయని నిర్ధారించడంలో సహాయపడుతుంది.
డేటాను తిరిగి పొందడానికి బాహ్య సేవపై ఆధారపడే ఫంక్షన్ను పరిగణించండి:
interface DataService {
getData(id: number): Promise<string>;
}
class MyComponent {
constructor(private dataService: DataService) {}
async fetchData(id: number): Promise<string> {
return this.dataService.getData(id);
}
}
`MyComponent`ని పరీక్షించడానికి, మీరు `DataService` యొక్క నకిలీ అమలును సృష్టించవచ్చు:
class MockDataService implements DataService {
getData(id: number): Promise<string> {
return Promise.resolve(`Data for id ${id}`);
}
}
it('should fetch data from the data service', async () => {
const mockDataService = new MockDataService();
const component = new MyComponent(mockDataService);
const data = await component.fetchData(123);
expect(data).toBe('Data for id 123');
});
`DataService` ఇంటర్ఫేస్ను అమలు చేయడం ద్వారా, `MockDataService` పరీక్ష సమయంలో టైప్-సంబంధిత ఎర్రర్లను నిరోధించడం ద్వారా అవసరమైన పద్ధతులను సరైన రకాలతో అందిస్తుందని నిర్ధారిస్తుంది.
Integration Testing in TypeScript: Verifying Interactions Between Modules
ఇంటిగ్రేషన్ టెస్టింగ్ ఒక అప్లికేషన్లో వివిధ యూనిట్లు లేదా మాడ్యూళ్ల మధ్య పరస్పర చర్యలను ధృవీకరించడంపై దృష్టి పెడుతుంది. సిస్టమ్ యొక్క విభిన్న భాగాలు సరిగ్గా కలిసి పనిచేస్తాయని నిర్ధారించడానికి ఈ స్థాయి పరీక్ష చాలా కీలకం.
Example: Integration Testing with a Database
డేటాను నిల్వ చేయడానికి మరియు తిరిగి పొందడానికి డేటాబేస్తో సంభాషించే అప్లికేషన్ను పరిగణించండి. ఈ అప్లికేషన్ కోసం ఒక ఇంటిగ్రేషన్ టెస్ట్లో ఇవి ఉండవచ్చు:
- పరీక్ష డేటాబేస్ను సెటప్ చేయడం.
- పరీక్ష డేటాతో డేటాబేస్ను నింపడం.
- డేటాబేస్తో సంభాషించే అప్లికేషన్ కోడ్ను అమలు చేయడం.
- డేటా సరిగ్గా నిల్వ చేయబడిందని మరియు తిరిగి పొందినట్లు ధృవీకరించడం.
- పరీక్ష పూర్తయిన తర్వాత పరీక్ష డేటాబేస్ను క్లీన్ చేయడం.
// integration/userRepository.test.ts
import { UserRepository } from '../src/userRepository';
import { DatabaseConnection } from '../src/databaseConnection';
describe('UserRepository', () => {
let userRepository: UserRepository;
let databaseConnection: DatabaseConnection;
beforeAll(async () => {
databaseConnection = new DatabaseConnection('test_database'); // Use a separate test database
await databaseConnection.connect();
userRepository = new UserRepository(databaseConnection);
});
afterAll(async () => {
await databaseConnection.disconnect();
});
beforeEach(async () => {
// Clear the database before each test
await databaseConnection.clearDatabase();
});
it('should create a new user in the database', async () => {
const newUser = { id: 1, name: 'Alice', email: 'alice@example.com' };
await userRepository.createUser(newUser);
const retrievedUser = await userRepository.getUserById(1);
expect(retrievedUser).toEqual(newUser);
});
it('should retrieve a user from the database by ID', async () => {
const existingUser = { id: 2, name: 'Bob', email: 'bob@example.com' };
await userRepository.createUser(existingUser);
const retrievedUser = await userRepository.getUserById(2);
expect(retrievedUser).toEqual(existingUser);
});
});
పరీక్ష వాతావరణాన్ని ఎలా సెటప్ చేయాలో, డేటాబేస్తో ఎలా సంభాషించాలో మరియు అప్లికేషన్ కోడ్ డేటాను సరిగ్గా నిల్వ చేస్తుందో మరియు తిరిగి పొందుతుందో ధృవీకరించడానికి ఈ ఉదాహరణ చూపిస్తుంది. డేటాబేస్ ఎంటిటీల కోసం టైప్స్క్రిప్ట్ ఇంటర్ఫేస్లను ఉపయోగించడం (ఉదాహరణకు, `User`) ఇంటిగ్రేషన్ టెస్టింగ్ ప్రక్రియ అంతటా టైప్ భద్రతను నిర్ధారిస్తుంది.
Mocking External Services in Integration Tests
ఇంటిగ్రేషన్ పరీక్షలలో, అప్లికేషన్ ఆధారపడే బాహ్య సేవలను మోక్ చేయడం తరచుగా అవసరం. ఇది మీ అప్లికేషన్ మరియు సేవ మధ్య అనుసంధానాన్ని నిజంగా సేవపై ఆధారపడకుండా పరీక్షించడానికి మిమ్మల్ని అనుమతిస్తుంది.
ఉదాహరణకు, మీ అప్లికేషన్ చెల్లింపు గేట్వేతో కలిసిపోతే, మీరు విభిన్న చెల్లింపు దృశ్యాలను అనుకరించడానికి గేట్వే యొక్క నకిలీ అమలును సృష్టించవచ్చు.
End-to-End (E2E) Testing in TypeScript: Simulating User Workflows
ఎండ్-టు-ఎండ్ (E2E) పరీక్షలో వినియోగదారు దృక్పథం నుండి మొత్తం అప్లికేషన్ వర్క్ఫ్లోను పరీక్షించడం ఉంటుంది. వాస్తవ ప్రపంచ వాతావరణంలో అప్లికేషన్ సరిగ్గా పనిచేస్తుందని నిర్ధారించడానికి ఈ రకమైన పరీక్ష చాలా కీలకం.
Choosing an E2E Testing Framework
టైప్స్క్రిప్ట్ కోసం అనేక ప్రసిద్ధ E2E పరీక్ష ఫ్రేమ్వర్క్లు అందుబాటులో ఉన్నాయి, వీటితో సహా:
- Cypress: అప్లికేషన్తో వినియోగదారు పరస్పర చర్యలను అనుకరించే పరీక్షలను వ్రాయడానికి మిమ్మల్ని అనుమతించే శక్తివంతమైన మరియు వినియోగదారు-స్నేహపూర్వక E2E పరీక్ష ఫ్రేమ్వర్క్.
- Playwright: టైప్స్క్రిప్ట్తో సహా బహుళ ప్రోగ్రామింగ్ భాషలకు మద్దతు ఇచ్చే క్రాస్-బ్రౌజర్ పరీక్షా ఫ్రేమ్వర్క్.
- Puppeteer: హెడ్లెస్ Chrome లేదా Chromiumని నియంత్రించడానికి ఉన్నత-స్థాయి APIని అందించే నోడ్ లైబ్రరీ.
సైప్రస్ దాని ఉపయోగించడానికి సులభమైనది మరియు సమగ్ర లక్షణాల కారణంగా వెబ్ అప్లికేషన్ల యొక్క E2E పరీక్షకు ప్రత్యేకంగా సరిపోతుంది. ప్లేరైట్ క్రాస్-బ్రౌజర్ అనుకూలత మరియు అధునాతన లక్షణాలకు అద్భుతమైనది. సైప్రస్ను ఉపయోగించి E2E పరీక్షా భావనలను మేము ప్రదర్శిస్తాము.
Example: E2E Testing with Cypress
లాగిన్ ఫారమ్తో కూడిన సాధారణ వెబ్ అప్లికేషన్ను పరిగణించండి. ఈ అప్లికేషన్ కోసం ఒక E2E పరీక్షలో ఇవి ఉండవచ్చు:
- లాగిన్ పేజీని సందర్శించడం.
- చెల్లుబాటు అయ్యే ఆధారాలను నమోదు చేయడం.
- ఫారమ్ను సమర్పించడం.
- వినియోగదారు హోమ్ పేజీకి దారి మళ్లించబడ్డారని ధృవీకరించడం.
// cypress/integration/login.spec.ts
describe('Login', () => {
it('should log in successfully with valid credentials', () => {
cy.visit('/login');
cy.get('#username').type('valid_user');
cy.get('#password').type('valid_password');
cy.get('button[type="submit"]').click();
cy.url().should('include', '/home');
cy.contains('Welcome, valid_user').should('be.visible');
});
it('should display an error message with invalid credentials', () => {
cy.visit('/login');
cy.get('#username').type('invalid_user');
cy.get('#password').type('invalid_password');
cy.get('button[type="submit"]').click();
cy.contains('Invalid username or password').should('be.visible');
});
});
వెబ్ అప్లికేషన్తో వినియోగదారు పరస్పర చర్యలను అనుకరించడానికి మరియు అప్లికేషన్ ఊహించిన విధంగా పనిచేస్తుందో లేదో ధృవీకరించడానికి సైప్రస్ను ఎలా ఉపయోగించాలో ఈ ఉదాహరణ చూపిస్తుంది. DOM, మేకింగ్ అసెర్షన్లు మరియు వినియోగదారు ఈవెంట్లను అనుకరించడానికి సైప్రస్ శక్తివంతమైన APIని అందిస్తుంది.
Type Safety in Cypress Tests
సైప్రస్ ప్రధానంగా జావాస్క్రిప్ట్-ఆధారిత ఫ్రేమ్వర్క్ అయినప్పటికీ, మీ E2E పరీక్షల యొక్క టైప్ భద్రతను మెరుగుపరచడానికి మీరు ఇప్పటికీ టైప్స్క్రిప్ట్ను ఉపయోగించవచ్చు. ఉదాహరణకు, మీరు అనుకూల ఆదేశాలను నిర్వచించడానికి మరియు API కాల్ల ద్వారా తిరిగి వచ్చే డేటాను టైప్ చేయడానికి టైప్స్క్రిప్ట్ను ఉపయోగించవచ్చు.
Best Practices for TypeScript Testing
మీ టైప్స్క్రిప్ట్ పరీక్షలు సమర్థవంతంగా మరియు నిర్వహించదగినవిగా ఉన్నాయని నిర్ధారించడానికి, ఈ క్రింది ఉత్తమ పద్ధతులను పరిగణించండి:
- Write Tests Early and Often: ప్రారంభం నుండి మీ అభివృద్ధి వర్క్ఫ్లోలో పరీక్షను ఏకీకృతం చేయండి. టెస్ట్-డ్రివెన్ డెవలప్మెంట్ (TDD) ఒక అద్భుతమైన విధానం.
- Focus on Testability: సులభంగా పరీక్షించగలిగేలా మీ కోడ్ను రూపొందించండి. భాగాలను వేరు చేయడానికి మరియు వాటిని మోక్ చేయడం సులభతరం చేయడానికి డిపెండెన్సీ ఇంజెక్షన్ను ఉపయోగించండి.
- Keep Tests Small and Focused: ప్రతి పరీక్ష కోడ్ యొక్క ఒక అంశంపై దృష్టి పెట్టాలి. ఇది పరీక్షలను అర్థం చేసుకోవడానికి మరియు నిర్వహించడానికి సులభతరం చేస్తుంది.
- Use Descriptive Test Names: పరీక్ష ఏమి ధృవీకరిస్తుందో స్పష్టంగా వివరించే పరీక్ష పేర్లను ఎంచుకోండి.
- Maintain a High Level of Test Coverage: కోడ్ యొక్క అన్ని భాగాలు తగినంతగా పరీక్షించబడ్డాయని నిర్ధారించడానికి అధిక పరీక్ష కవరేజ్ కోసం లక్ష్యంగా పెట్టుకోండి.
- Automate Your Tests: కోడ్ మార్పులు చేసినప్పుడల్లా పరీక్షలను స్వయంచాలకంగా అమలు చేయడానికి మీ పరీక్షలను నిరంతర ఏకీకరణ (CI) పైప్లైన్లో ఏకీకృతం చేయండి.
- Use Code Coverage Tools: పరీక్ష కవరేజ్ను కొలవడానికి మరియు తగినంతగా పరీక్షించబడని కోడ్ యొక్క ప్రాంతాలను గుర్తించడానికి సాధనాలను ఉపయోగించండి.
- Refactor Tests Regularly: మీ కోడ్ మారినప్పుడు, మీ పరీక్షలను తాజాగా మరియు నిర్వహించదగినదిగా ఉంచడానికి వాటిని రిఫ్యాక్టర్ చేయండి.
- Document Your Tests: పరీక్ష యొక్క ఉద్దేశ్యాన్ని మరియు అది చేసే ఏవైనా అంచనాలను వివరించడానికి మీ పరీక్షలకు వ్యాఖ్యలను జోడించండి.
- Follow the AAA Pattern: అమర్చు, నటించు, నమ్మకం. ఇది మీ పరీక్షలను చదవడానికి నిర్మాణాత్మకంగా సహాయపడుతుంది.
Conclusion: Building Robust Applications with Type-Safe TypeScript Testing
టైప్స్క్రిప్ట్ యొక్క బలమైన టైపింగ్ సిస్టమ్ బలమైన మరియు నిర్వహించదగిన అప్లికేషన్లను రూపొందించడానికి శక్తివంతమైన పునాదిని అందిస్తుంది. మీ పరీక్ష వ్యూహాలలో టైప్ భద్రతను ఉపయోగించడం ద్వారా, మీరు లోపాలను ముందుగా గుర్తించి, మీ కోడ్ యొక్క మొత్తం నాణ్యతను మెరుగుపరిచే మరింత విశ్వసనీయమైన మరియు సమర్థవంతమైన పరీక్షలను సృష్టించవచ్చు. ఈ ఆర్టికల్ యూనిట్ టెస్టింగ్ నుండి ఇంటిగ్రేషన్ టెస్టింగ్ వరకు ఎండ్-టు-ఎండ్ టెస్టింగ్ వరకు వివిధ టైప్స్క్రిప్ట్ పరీక్ష వ్యూహాలను పరిశీలించింది, టైప్స్క్రిప్ట్ పరీక్షకు మీకు సమగ్ర మార్గదర్శిని అందిస్తుంది. ఈ ఆర్టికల్లో వివరించిన ఉత్తమ పద్ధతులను అనుసరించడం ద్వారా, మీ టైప్స్క్రిప్ట్ అప్లికేషన్లు పూర్తిగా పరీక్షించబడ్డాయని మరియు ఉత్పత్తికి సిద్ధంగా ఉన్నాయని మీరు నిర్ధారించుకోవచ్చు. ప్రారంభం నుండి సమగ్ర పరీక్షా విధానాన్ని స్వీకరించడం వలన డెవలపర్లు ప్రపంచవ్యాప్తంగా మరింత నమ్మదగిన మరియు నిర్వహించదగిన సాఫ్ట్వేర్ను సృష్టించడానికి అనుమతిస్తుంది, ఇది మెరుగైన వినియోగదారు అనుభవాలకు మరియు అభివృద్ధి ఖర్చులను తగ్గించడానికి దారితీస్తుంది. టైప్స్క్రిప్ట్ స్వీకరణ పెరుగుతూనే ఉన్నందున, టైప్-సేఫ్ టెస్టింగ్లో నైపుణ్యం సాధించడం ప్రపంచవ్యాప్తంగా సాఫ్ట్వేర్ ఇంజనీర్లకు మరింత విలువైన నైపుణ్యంగా మారుతుంది.