From manual testing basics to automation mastery. Plain-English guidance, real test cases, frameworks, and interview prep. Written for beginners and aspiring QA professionals.
Start typing to filter sections.
QA (Quality Assurance) testing is the process of evaluating software to find bugs, ensure functionality, and verify that the product meets requirements. Think of it as being the gatekeeper between development and production—you make sure nothing broken reaches users.
QA engineers test applications by executing test cases, finding defects, reporting bugs, and verifying fixes. You work closely with developers, product managers, and business analysts to ensure quality at every stage.
Do I need a CS degree? No. Many QA engineers come from non-technical backgrounds and learn on the job.
How long to become job-ready? 10-14 weeks with 15-20 hours/week of focused learning and practice.
Manual vs Automation - which first? Start with manual testing fundamentals, then learn automation after 2-3 months.
What tools do I need? Jira, Postman, Browser DevTools, Git. For automation: Selenium, TestNG, Maven.
If you're brand new, start here and follow the order below.
Bug/Defect: Error or flaw in software causing incorrect behavior.
Test Case: A set of steps to verify a specific feature or functionality.
Test Scenario: High-level testing requirement (e.g., "Verify login functionality").
Regression: Re-testing after code changes to ensure no new bugs.
Severity: Impact of a bug (Critical, High, Medium, Low).
Priority: Urgency to fix (P0, P1, P2, P3).
Manual testing is the foundation of QA. You execute test cases by hand, explore features, and verify functionality without automation scripts.
Every test case should have these components:
| Field | Description | Example |
|---|---|---|
| Test Case ID | Unique identifier | TC_LOGIN_001 |
| Title | Brief description | Verify login with valid credentials |
| Preconditions | Setup required | User account exists, app is open |
| Test Steps | Actions to perform | 1. Enter username 2. Enter password 3. Click Login |
| Test Data | Input values | [email protected] / Pass123 |
| Expected Result | What should happen | User redirected to dashboard |
| Actual Result | What happened | Pass or details if failed |
| Status | Test outcome | Pass / Fail / Blocked |
Test Case 1: Login with valid credentials
Test Case 2: Login with invalid password
A good bug report should include:
| Severity | Definition | Example |
|---|---|---|
| Critical | Application crash, data loss, security breach | Payment processing fails |
| High | Major feature broken, workaround exists | Search returns no results |
| Medium | Feature works but with issues | Button alignment off by 2px |
| Low | Cosmetic, minor inconvenience | Typo in footer text |
Exploratory Testing: Freestyle testing without predefined test cases. Learn the app, find edge cases, think like an end-user.
Boundary Testing: Test limits (min/max values, character limits, date ranges).
Negative Testing: Try to break the system (invalid inputs, SQL injection, XSS).
Usability Testing: Is the app easy to use? Intuitive navigation? Clear error messages?
Automation testing uses scripts to execute repetitive test cases, saving time and increasing coverage. Selenium is the industry standard for web automation.
Step 1: Install Java JDK 8+ and Maven
Step 2: Add Selenium dependency in pom.xml:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.15.0</version>
</dependency>
Step 3: Download ChromeDriver matching your Chrome version
Step 4: Write your first test:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class FirstTest {
public static void main(String[] args) {
// Set driver path
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
// Initialize browser
WebDriver driver = new ChromeDriver();
// Navigate to URL
driver.get("https://www.google.com");
// Verify title
String title = driver.getTitle();
System.out.println("Page title: " + title);
// Close browser
driver.quit();
}
}
Finding elements on a web page is crucial for automation. Selenium provides 8 locator types:
| Locator | Syntax | Use Case |
|---|---|---|
| ID | driver.findElement(By.id("username")) | Most reliable, unique identifier |
| Name | By.name("email") | Form fields |
| Class Name | By.className("btn-primary") | Styling classes |
| CSS Selector | By.cssSelector("#login .submit") | Fast, flexible |
| XPath | By.xpath("//input[@type='submit']") | Complex hierarchies |
| Link Text | By.linkText("Forgot Password?") | Exact text match on links |
| Partial Link Text | By.partialLinkText("Forgot") | Partial match |
| Tag Name | By.tagName("button") | Generic elements |
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
public class LoginTest {
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
// Navigate
driver.get("https://example.com/login");
// Find elements and enter data
WebElement emailField = driver.findElement(By.id("email"));
emailField.sendKeys("[email protected]");
WebElement passwordField = driver.findElement(By.name("password"));
passwordField.sendKeys("Test@123");
WebElement loginButton = driver.findElement(By.cssSelector("button[type='submit']"));
loginButton.click();
// Wait for page load
Thread.sleep(2000);
// Verify success
String currentUrl = driver.getCurrentUrl();
if(currentUrl.contains("/dashboard")) {
System.out.println("Login Test: PASSED");
} else {
System.out.println("Login Test: FAILED");
}
driver.quit();
}
}
TestNG helps organize tests, add assertions, generate reports, and run tests in parallel.
import org.testng.Assert;
import org.testng.annotations.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class TestNGExample {
WebDriver driver;
@BeforeMethod
public void setup() {
driver = new ChromeDriver();
driver.get("https://example.com");
}
@Test(priority = 1)
public void testTitle() {
String title = driver.getTitle();
Assert.assertEquals(title, "Expected Title");
}
@Test(priority = 2)
public void testLogin() {
// Login steps
Assert.assertTrue(driver.getCurrentUrl().contains("dashboard"));
}
@AfterMethod
public void teardown() {
driver.quit();
}
}
POM is a design pattern that creates an object repository for web elements. Each page is a class, elements are variables, and actions are methods.
// LoginPage.java
public class LoginPage {
WebDriver driver;
// Locators
By emailField = By.id("email");
By passwordField = By.id("password");
By loginButton = By.cssSelector("button[type='submit']");
// Constructor
public LoginPage(WebDriver driver) {
this.driver = driver;
}
// Actions
public void enterEmail(String email) {
driver.findElement(emailField).sendKeys(email);
}
public void enterPassword(String password) {
driver.findElement(passwordField).sendKeys(password);
}
public void clickLogin() {
driver.findElement(loginButton).click();
}
public void login(String email, String password) {
enterEmail(email);
enterPassword(password);
clickLogin();
}
}
Master these tools to become an effective QA engineer. Each serves a specific purpose in your testing workflow.
| Category | Tool | Purpose |
|---|---|---|
| Test Management | Jira, TestRail, Zephyr | Track test cases, bugs, sprints |
| API Testing | Postman, REST Assured, SoapUI | Test REST/SOAP APIs, collections |
| Automation | Selenium, Cypress, Playwright | Web UI automation |
| Mobile Testing | Appium, Espresso, XCUITest | Android/iOS app testing |
| Performance | JMeter, LoadRunner, Gatling | Load, stress, spike testing |
| Version Control | Git, GitHub, Bitbucket | Code management, collaboration |
| CI/CD | Jenkins, GitHub Actions, GitLab CI | Automated test execution |
| Database | MySQL Workbench, pgAdmin, DBeaver | Query databases, validate data |
Jira is the go-to tool for tracking bugs, user stories, and test execution. Key workflows:
Chrome DevTools is essential for debugging and understanding web applications:
Version control is crucial for managing automation scripts:
# Clone repository git clone https://github.com/username/repo.git # Create new branch git checkout -b feature/login-tests # Check status git status # Add files git add . # Commit changes git commit -m "Added login test cases" # Push to remote git push origin feature/login-tests # Pull latest changes git pull origin main
Modern applications rely on APIs for backend communication. API testing validates data exchange, performance, and security without a UI.
API (Application Programming Interface) testing verifies that endpoints return correct data, handle errors properly, and meet performance standards. You test the logic layer directly—faster and more reliable than UI testing.
REST uses HTTP methods to perform CRUD operations:
| Method | Purpose | Example |
|---|---|---|
| GET | Retrieve data | GET /api/users/123 |
| POST | Create new record | POST /api/users |
| PUT | Update entire record | PUT /api/users/123 |
| PATCH | Partial update | PATCH /api/users/123 |
| DELETE | Remove record | DELETE /api/users/123 |
| Code | Meaning | When It Appears |
|---|---|---|
| 200 | OK | Successful GET/PUT/PATCH |
| 201 | Created | Successful POST |
| 204 | No Content | Successful DELETE |
| 400 | Bad Request | Invalid data sent |
| 401 | Unauthorized | Missing/invalid auth token |
| 404 | Not Found | Resource doesn't exist |
| 500 | Server Error | Backend crashed |
Postman is the #1 tool for API testing. Key features:
// Test 1: Verify status code
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
// Test 2: Check response time
pm.test("Response time is less than 500ms", function () {
pm.expect(pm.response.responseTime).to.be.below(500);
});
// Test 3: Validate JSON structure
pm.test("Response has user data", function () {
var jsonData = pm.response.json();
pm.expect(jsonData).to.have.property('name');
pm.expect(jsonData).to.have.property('email');
});
// Test 4: Save token for next request
var jsonData = pm.response.json();
pm.environment.set("auth_token", jsonData.token);
QA engineers need basic SQL to validate data integrity and backend logic:
-- Select all users SELECT * FROM users; -- Find specific user SELECT * FROM users WHERE email = '[email protected]'; -- Count total records SELECT COUNT(*) FROM orders WHERE status = 'completed'; -- Join tables SELECT orders.id, users.name, orders.total FROM orders INNER JOIN users ON orders.user_id = users.id; -- Check for duplicates SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1; -- Validate data after API call SELECT * FROM users WHERE created_at > '2024-12-01';
QA interviews typically have 3 rounds: HR screening, technical round (concepts + live testing), and practical automation challenge.
1. What is the difference between QA and QC?
QA (Quality Assurance) is process-oriented—preventing defects through good practices. QC (Quality Control) is product-oriented—finding defects through testing.
2. Explain SDLC and STLC
SDLC (Software Development Life Cycle) covers entire product development. STLC (Software Testing Life Cycle) focuses on testing phases: requirement analysis, test planning, test case development, environment setup, test execution, and closure.
3. What is regression testing?
Re-testing existing functionality after code changes to ensure nothing broke. Usually automated and run before each release.
4. Difference between severity and priority?
Severity = Impact on application (Critical/High/Medium/Low). Priority = Urgency to fix (P0/P1/P2/P3). High severity bug might have low priority if it's an edge case.
5. What is boundary value analysis?
Testing at the edges of input ranges. For age field 18-60, test: 17, 18, 19, 59, 60, 61.
6. Explain test case vs test scenario
Test scenario is high-level (e.g., "Verify login functionality"). Test case is detailed steps with expected results.
7. What is smoke testing vs sanity testing?
Smoke = Quick check of critical functionality after build. Sanity = Focused testing after bug fix to verify the fix works.
8. How do you prioritize test cases?
Based on: Critical business features → High-risk areas → Frequently used functionality → Recent code changes.
9. What is a test plan?
Document outlining testing scope, approach, resources, schedule, risks, and deliverables for a project.
10. Explain black box vs white box testing
Black box = Testing without knowing internal code structure. White box = Testing with knowledge of code, logic, and architecture.
11. Why Selenium? Advantages over other tools?
Open source, supports multiple languages (Java, Python, C#), cross-browser compatible, large community, integrates with TestNG/JUnit.
12. What are different types of waits in Selenium?
13. What is Page Object Model?
Design pattern separating page elements and actions into classes. Each page = one class. Improves maintainability and reduces code duplication.
14. How do you handle dropdowns in Selenium?
Select dropdown = new Select(driver.findElement(By.id("country")));
dropdown.selectByVisibleText("United States");
dropdown.selectByValue("us");
dropdown.selectByIndex(2);
15. How to take screenshots in Selenium?
TakesScreenshot ts = (TakesScreenshot)driver;
File source = ts.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(source, new File("./screenshots/test.png"));
16. What is the difference between PUT and PATCH?
PUT updates the entire resource. PATCH updates only specific fields. PUT is idempotent (same result if called multiple times), PATCH may or may not be.
17. How do you test REST APIs?
Using Postman or REST Assured. Verify: status codes, response time, JSON schema, data accuracy, error handling, authentication.
18. What is the difference between authentication and authorization?
Authentication = Verifying identity (login with username/password). Authorization = Verifying permissions (can this user access admin panel?).
19. How do you handle disagreements with developers about bug severity?
Provide evidence (screenshots, logs, user impact data). Focus on business impact rather than personal opinions. Escalate to manager if needed with facts.
20. Describe a challenging bug you found and how you resolved it
Use STAR method: Situation (intermittent payment failure) → Task (find root cause) → Action (analyzed logs, checked network calls, reproduced in staging) → Result (found timeout issue, worked with dev to fix, added monitoring).
| Level | Experience | Salary Range | Key Skills |
|---|---|---|---|
| Junior QA | 0-2 years | $55K - $75K | Manual testing, test cases, Jira, basic SQL |
| QA Engineer | 2-4 years | $75K - $95K | Automation (Selenium), API testing, TestNG |
| Senior QA | 5-7 years | $95K - $125K | Framework design, CI/CD, mentoring, performance testing |
| QA Lead | 8-10 years | $120K - $150K | Team management, strategy, test planning, stakeholder communication |
| SDET | 3-6 years | $100K - $140K | Strong coding, framework development, architecture |
Note: SF/NYC +20-30%, Remote -10%, Healthcare/Finance +$8-12K premium
Performance testing ensures your application handles expected load, scales properly, and responds quickly under stress.
| Metric | Description | Good Benchmark |
|---|---|---|
| Response Time | Time from request to response | < 2 seconds |
| Throughput | Requests processed per second | Depends on app |
| Error Rate | % of failed requests | < 1% |
| CPU Usage | Server CPU utilization | < 80% |
| Memory Usage | RAM consumption | < 85% |
Apache JMeter is the industry-standard open-source tool for performance testing.
Key components:
Path 1: QA Specialist
Junior QA → QA Engineer → Senior QA → QA Lead → QA Manager
Path 2: Automation Expert
QA Engineer → Automation Engineer → SDET → Automation Architect
Path 3: Development Transition
QA Engineer → SDET → Software Developer → Full Stack Developer
| Stage | Technical Skills | Soft Skills |
|---|---|---|
| Junior (0-2 yrs) | Manual testing, SQL basics, Jira, test case writing | Attention to detail, communication, teamwork |
| Mid-Level (2-5 yrs) | Selenium, API testing, TestNG, Git, CI/CD basics | Time management, mentoring, proactive problem-solving |
| Senior (5+ yrs) | Framework design, performance testing, cloud, Docker | Leadership, strategy, stakeholder management, decision-making |
Yes! Many successful QA engineers started with no coding experience. Begin with manual testing, learn test case writing and bug reporting, then gradually add automation skills.
Java or Python. Java is widely used with Selenium and has more enterprise job opportunities. Python is easier to learn and great for quick scripting.
10-14 weeks with focused learning (15-20 hours/week). Timeline: Manual testing basics (3 weeks) → Automation fundamentals (4 weeks) → API testing (2 weeks) → Projects & Interview prep (3-4 weeks).
Absolutely. With more companies adopting Agile and DevOps, demand for skilled QA engineers (especially automation) is growing. Bureau of Labor Statistics projects 25% growth through 2030.
Automation engineers typically earn $15K-$25K more than manual testers at the same experience level. SDETs (Software Development Engineers in Test) earn similar to developers.
QA Engineer focuses on testing (manual + automation). SDET (Software Development Engineer in Test) is a developer who writes code and builds testing frameworks. SDETs require stronger programming skills.
Basic DevOps knowledge helps: Git for version control, Jenkins/GitHub Actions for CI/CD, Docker for environment setup. Not mandatory for entry-level, but valuable for senior roles.
1) Create test cases for popular apps (Amazon, Netflix) 2) Build Selenium automation framework on GitHub 3) Write bug reports for open-source projects 4) Create API test collections in Postman and publish.