Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Ngày xuất bản
Ngày xuất bản

Các loại kiểm thử trong Kiểm thử tự động: Toàn tập về Automation Test Types

Giới thiệu về các loại kiểm thử trong Kiểm thử tự động

Trong thời đại phát triển phần mềm hiện đại, kiểm thử tự động (Automation Testing) đã trở thành một phần không thể thiếu để đảm bảo chất lượng sản phẩm. Nó giúp tăng tốc độ, cải thiện độ chính xác và giảm thiểu lỗi do con người. Tuy nhiên, không phải ai cũng hiểu rõ về các loại kiểm thử trong kiểm thử tự động, vai trò của từng loại và cách lựa chọn phù hợp cho dự án. Bài viết này sẽ giúp bạn nắm vững toàn bộ các loại kiểm thử tự động, từ cơ bản đến nâng cao, kèm ví dụ thực tế, công cụ phổ biến và bảng so sánh chi tiết.

Các loại kiểm thử trong Kiểm thử tự động

Kiểm Thử Đơn Vị (Unit Testing)

  • Định nghĩa: Kiểm thử đơn vị là bước đầu tiên và cơ bản nhất trong kiểm thử tự động. Nó tập trung vào việc kiểm tra các thành phần nhỏ nhất của mã nguồn, chẳng hạn như hàm, phương thức hoặc lớp. Mục tiêu là đảm bảo rằng từng đơn vị mã hoạt động đúng như kỳ vọng.
  • Ai viết?: Chủ yếu do developer đảm nhận.
  • Đặc điểm
    • Chạy nhanh, phát hiện lỗi sớm trong quá trình phát triển.
    • Đễ bảo trì, tăng tính tái sử dụng mã.
    • Tăng độ tin cậy khi refactor.
    • Dễ dàng tích hợp vào CI/CD pipeline.
    • Phát hiện lỗi sớm,
  • Công cụ phổ biến: JUnit (Java), NUnit (.NET), PyTest (Python), Jest, Vitest,Mocha (JavaScript/TypeScript), PHPUnit,Pest(PHP)
  • Ví dụ:
    • Kiểm tra hàm tính tổng hai số trả về đúng kết quả.
    • Hàm tính tổng giỏ hàng, kiểm tra nếu số lượng âm thì trả lỗi.

Kiểm Thử Tích Hợp (Integration Testing)

  • Định nghĩa: Sau khi các đơn vị mã được kiểm tra, kiểm thử tích hợp đảm bảo rằng các thành phần này hoạt động tốt khi kết hợp với nhau. Loại kiểm thử này thường kiểm tra các module hoặc dịch vụ tích hợp, như API hoặc cơ sở dữ liệu.
  • Vai trò:
    • Đảm bảo các thành phần giao tiếp với nhau đúng cách.
    • Phát hiện lỗi do thay đổi cấu trúc hoặc logic luồng dữ liệu.
  • Đặc điểm: Phát hiện lỗi khi các phần tích hợp với nhau, kiểm tra luồng dữ liệu giữa các module. Đảm bảo hệ thống hoạt động thống nhất.
  • Công cụ phổ biến:
    • Java: TestNG
    • NodeJS: Supertest, Mocha
    • PHP: PHPUnit
  • Ví dụ:
    • Kiểm thử tích hợp API tạo đơn hàng với giỏ hàng & thanh toán.
    • Kiểm tra xem API trả về dữ liệu đúng định dạng JSON khi gọi từ frontend.

Functional/UI Testing

  • Mục tiêu: Đảm bảo phần mềm hoạt động đúng theo yêu cầu nghiệp vụ từ góc nhìn người dùng. Đảm bảo từng chức năng riêng lẻ của phần mềm hoạt động đúng theo yêu cầu nghiệp vụ, thường tập trung vào giao diện người dùng (UI).
  • Phạm vi: Kiểm tra từng chức năng hoặc màn hình cụ thể, ví dụ: kiểm tra nút "Đăng nhập" có hoạt động đúng không, form nhập liệu có validate đúng không.
  • Đặc điểm:
    • Mô phỏng thao tác người dùng, kiểm tra giao diện và chức năng.
    • Thường kiểm tra từng tính năng độc lập.
  • Công cụ phổ biến: Selenium, Cypress, Playwright, TestCafe.
  • Ví dụ:
    • Kiểm tra nút "Thêm vào giỏ hàng" có thêm sản phẩm đúng không.
    • Kiểm tra form đăng ký có validate email hợp lệ.

Kiểm thử API - API Testing

  • Mục tiêu: Kiểm thử các API (REST, SOAP) về tính đúng đắn, hiệu năng, bảo mật.
  • Đặc điểm: Không phụ thuộc giao diện, kiểm tra trực tiếp các endpoint.
  • Công cụ phổ biến: Postman, RestAssured, Karate, SoapUI.
  • Ví dụ: Gửi request POST tạo user mới và kiểm tra response trả về.

Kiểm thử đầu-cuối - End-to-End (E2E) Testing

  • Định nghĩa: Mô phỏng hành vi thực tế của người dùng. Kiểm thử toàn bộ luồng nghiệp vụ từ đầu đến cuối như người dùng thực tế.
  • Đặc điểm:
    • Mô phỏng hành vi người dùng, kiểm tra tích hợp nhiều hệ thống.
  • Mục tiêu:
    • Đảm bảo hệ thống hoạt động đúng như mong đợi từ frontend đến backend.
    • Bắt được lỗi giao diện, luồng sử dụng và logic toàn hệ thống.
    • Kiểm tra toàn bộ luồng nghiệp vụ từ đầu đến cuối như một người dùng thực sự, bao gồm cả frontend, backend, database, và các hệ thống tích hợp khác
  • Phạm vi: Mô phỏng hành trình thực tế của người dùng qua nhiều chức năng, nhiều hệ thống liên kết.
  • Công cụ phổ biến: Cypress, Playwright, Selenium, testRigor.
  • Ví dụ:
    • Tự động kiểm tra quy trình mua hàng từ chọn sản phẩm đến thanh toán.
    • Từ đăng nhập → tìm sản phẩm → thêm vào giỏ → thanh toán → nhận email xác nhận.

Kiểm thử hồi quy - Regression Testing

  • Mục tiêu: Đảm bảo các tính năng cũ vẫn hoạt động sau khi thêm tính năng mới hoặc sửa bug.
  • Đặc điểm:
    • Lặp đi lặp lại, phù hợp tự động hóa, Chạy lại nhiều test case.
  • Tại sao tự động hóa?
    • Tiết kiệm thời gian so với kiểm thử thủ công.
    • Có thể chạy lại toàn bộ test suite sau mỗi lần thay đổi code.
  • Công cụ phổ biến: Selenium, Cypress, Playwright, JUnit, TestNG.
  • Tích hợp CI/CD: Chạy regression test mỗi lần deploy để đảm bảo không "break" hệ thống.
  • Ví dụ: Chạy lại toàn bộ test suite sau khi thêm tính năng mới.

Kiểm Thử Hiệu năng - Performance/Load Testing

Dù phần lớn là kiểm thử non-functional, nhưng vẫn có thể tự động hóa kiểm thử tải (load test), áp lực (stress test).

  • Mục tiêu: Đánh giá hiệu năng, tốc độ, khả năng chịu tải của hệ thống, Phát hiện tắc nghẽn hiệu suất.
  • Đặc điểm: Mô phỏng nhiều user truy cập đồng thời, đo thời gian phản hồi.
  • Công cụ phổ biến: JMeter, Gatling, k6, Locust.
  • Ví dụ: Kiểm tra website có chịu được 10.000 user truy cập cùng lúc không.

Kiểm Thử Bảo Mật (Security Testing)**

  • Mục tiêu: Phát hiện lỗ hổng bảo mật, đảm bảo an toàn cho hệ thống.
  • Đặc điểm: Kiểm tra các lỗ hổng phổ biến như SQL Injection, XSS, CSRF..
  • Công cụ phổ biến: OWASP ZAP, Burp Suite, SonarQube.
  • Ví dụ: Tự động quét lỗ hổng bảo mật trên API.

Bảng so sánh các loại kiểm thử tự động

Loại kiểm thử Mục tiêu chính Công cụ phổ biến Đặc điểm nổi bật Ai viết?
Unit Test Kiểm tra đơn vị nhỏ nhất JUnit, PyTest, Jest, Mocha, Vitest, PHPUnit, Pest Nhanh, phát hiện lỗi sớm Developer
Integration Test Kiểm tra tích hợp module TestNG, Mocha, Supertest, PHPUnit Kiểm tra luồng dữ liệu Developer/Tester
Functional/UI Test Kiểm tra chức năng, giao diện Selenium, Cypress, Playwright Mô phỏng thao tác người dùng Developer
API Test Kiểm tra API Postman, RestAssured, Karate Không phụ thuộc giao diện Developer
E2E Test Kiểm tra toàn bộ luồng nghiệp vụ Playwright, Cypress, Selenium Mô phỏng người dùng thực tế QA Automation
Regression Test Kiểm tra hồi quy Cypress, , Selenium, Cypress, JUnit Lặp lại, phù hợp tự động hóa QA Automation
Performance Test Kiểm tra hiệu năng, tải JMeter, Gatling, k6 Đo thời gian, mô phỏng nhiều user DevOps/Tester
Security Test Kiểm tra bảo mật OWASP ZAP, Burp Suite Phát hiện lỗ hổng Developer

Khi nào nên sử dụng từng loại kiểm thử tự động?

  • Unit Test: Khi muốn phát hiện lỗi sớm, kiểm tra logic nhỏ, phù hợp CI/CD.
  • Integration Test: Khi cần kiểm tra sự phối hợp giữa các module/service.
  • Functional/UI Test: Khi cần đảm bảo chức năng chính hoạt động đúng.
  • API Test: Khi backend và frontend phát triển độc lập hoặc cần kiểm tra API.
  • Regression Test: Khi dự án có nhiều lần cập nhật, cần đảm bảo không lỗi hồi quy.
  • Performance Test: Khi cần kiểm tra khả năng chịu tải, tối ưu hệ thống.
  • Security Test: Khi sản phẩm yêu cầu bảo mật cao.
  • End-to-End Test: Khi cần kiểm tra toàn bộ quy trình nghiệp vụ.

Ví dụ thực tế về áp dụng các loại kiểm thử tự động

Ví dụ 1: Unit Test với Jest (JavaScript)

function sum(a, b) {
  return a + b;
}

test('sum of 1 + 2 equals 3', () => {
  expect(sum(1, 2)).toBe(3);
});

Ví dụ Integration Test với NodeJS (Jest + Supertest)

describe('Order Integration Tests', () => {
    it('should create order with cart and payment', async () => {
        // Tạo giỏ hàng
        const cartResponse = await request(app)
            .post('/api/cart')
            .send({
                productId: 1,
                quantity: 2
            });
        
        expect(cartResponse.status).toBe(201);
        const cartId = cartResponse.body.id;
        
        // Tạo đơn hàng
        const orderResponse = await request(app)
            .post('/api/orders')
            .send({
                cartId: cartId,
                shippingAddress: '123 Test St'
            });
            
        expect(orderResponse.status).toBe(201);
        expect(orderResponse.body.status).toBe('pending');
        
        // Kiểm tra thanh toán được tạo
        const paymentResponse = await request(app)
            .get(`/api/payments/order/${orderResponse.body.id}`);
            
        expect(paymentResponse.status).toBe(200);
        expect(paymentResponse.body.amount).toBe(orderResponse.body.totalAmount);
    });
});

Ví dụ 2: API Test với Postman

  • Gửi request POST tạo user mới, kiểm tra response status 201 và dữ liệu trả về đúng.

Ví dụ 3: End-to-End Test với Playwright

import { test, expect } from '@playwright/test';

test('should complete checkout successfully', async ({ page }) => {
  // Truy cập trang chủ
  await page.goto('/');
  
  // Thêm sản phẩm vào giỏ hàng
  await page.click('#add-to-cart');
  
  // Chuyển đến trang thanh toán
  await page.click('#checkout');
  
  // Nhập thông tin thanh toán
  await page.fill('#payment', '4111111111111111');
  
  // Gửi form thanh toán
  await page.click('#submit');
  
  // Kiểm tra thông báo thành công
  await expect(page.locator('text=Order Success')).toBeVisible();
});

Các công cụ phổ biến cho từng loại kiểm thử tự động

  • Unit Test: JUnit, NUnit, PyTest, Jest
  • Integration Test: TestNG, Mocha, Postman, RestAssured
  • Functional/UI Test: Selenium, Cypress, Playwright, TestCafe
  • API Test: Postman, RestAssured, Karate, SoapUI
  • Regression Test: Selenium, Cypress, Playwright
  • Performance Test: JMeter, Gatling, k6, Locust
  • Security Test: OWASP ZAP, Burp Suite, SonarQube
  • End-to-End Test: Cypress, Playwright, Selenium
  • Smoke/Sanity Test: Selenium, Cypress
  • Data-driven Test: TestNG, JUnit, PyTest, Robot Framework

Kết luận

Việc hiểu rõ các loại kiểm thử trong kiểm thử tự động giúp bạn xây dựng chiến lược kiểm thử hiệu quả, tiết kiệm chi phí và nâng cao chất lượng sản phẩm. Hãy lựa chọn loại kiểm thử phù hợp với mục tiêu dự án, kết hợp nhiều loại kiểm thử để đạt hiệu quả tối ưu. Đầu tư vào kiểm thử tự động là đầu tư cho sự thành công lâu dài của sản phẩm phần mềm.