test-frameworks

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Testing Frameworks

测试框架

Web Testing Frameworks

Web测试框架

Selenium

Selenium

Best for: Cross-browser testing, legacy applications
  • Supports multiple languages (Java, Python, JavaScript, C#)
  • Wide browser support including legacy browsers
  • Large community and extensive documentation
  • Steeper learning curve
  • Slower execution compared to modern frameworks
java
// Java Selenium example
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
WebElement element = driver.findElement(By.id("username"));
element.sendKeys("testuser");
driver.quit();
最适用于:跨浏览器测试、遗留应用
  • 支持多种编程语言(Java、Python、JavaScript、C#)
  • 广泛的浏览器支持,包括遗留浏览器
  • 庞大的社区和详尽的文档
  • 学习曲线较陡
  • 执行速度比现代框架慢
java
// Java Selenium example
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
WebElement element = driver.findElement(By.id("username"));
element.sendKeys("testuser");
driver.quit();

Cypress

Cypress

Best for: Modern web applications, fast feedback
  • JavaScript/TypeScript native
  • Real-time reloads and debugging
  • Automatic waiting and retries
  • Network traffic control and stubbing
  • Excellent developer experience
  • Limited to JavaScript-based applications
javascript
// Cypress example
describe('Login', () => {
  it('should login successfully', () => {
    cy.visit('/login');
    cy.get('#username').type('testuser');
    cy.get('#password').type('password');
    cy.get('#login').click();
    cy.url().should('include', '/dashboard');
  });
});
最适用于:现代Web应用、快速反馈
  • 原生支持JavaScript/TypeScript
  • 实时重载与调试
  • 自动等待与重试
  • 网络流量控制与存根
  • 极佳的开发者体验
  • 仅支持基于JavaScript的应用
javascript
// Cypress example
describe('Login', () => {
  it('should login successfully', () => {
    cy.visit('/login');
    cy.get('#username').type('testuser');
    cy.get('#password').type('password');
    cy.get('#login').click();
    cy.url().should('include', '/dashboard');
  });
});

Playwright

Playwright

Best for: Modern web applications, cross-browser testing
  • Multi-language support (JavaScript, Python, Java, .NET)
  • Fast, reliable, and cross-browser
  • Auto-waiting for elements
  • Network interception and mocking
  • Parallel test execution
  • Headless and headed execution
javascript
// Playwright JavaScript example
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.fill('#username', 'testuser');
  await page.click('#login');
  await browser.close();
})();
最适用于:现代Web应用、跨浏览器测试
  • 多语言支持(JavaScript、Python、Java、.NET)
  • 快速、可靠且支持跨浏览器
  • 元素自动等待
  • 网络拦截与模拟
  • 并行测试执行
  • 无头与有头模式执行
javascript
// Playwright JavaScript example
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.fill('#username', 'testuser');
  await page.click('#login');
  await browser.close();
})();

Puppeteer

Puppeteer

Best for: Chrome/Chromium testing, scraping
  • Chrome DevTools Protocol integration
  • Headless browser automation
  • Fast execution
  • JavaScript/TypeScript native
  • Chrome/Chromium only
javascript
// Puppeteer example
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.type('#username', 'testuser');
  await page.click('#login');
  await browser.close();
})();
最适用于:Chrome/Chromium测试、数据爬取
  • 集成Chrome DevTools协议
  • 无头浏览器自动化
  • 执行速度快
  • 原生支持JavaScript/TypeScript
  • 仅支持Chrome/Chromium
javascript
// Puppeteer example
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.type('#username', 'testuser');
  await page.click('#login');
  await browser.close();
})();

JavaScript Testing Frameworks

JavaScript测试框架

Jest

Jest

Best for: React, Node.js, general JavaScript testing
  • Zero configuration setup
  • Built-in assertions and mocking
  • Snapshot testing
  • Parallel test execution
  • Code coverage reporting
javascript
// Jest example
describe('Calculator', () => {
  test('adds 1 + 2 to equal 3', () => {
    expect(add(1, 2)).toBe(3);
  });
  
  test('async operation', async () => {
    const result = await fetchData();
    expect(result).toEqual({ data: 'test' });
  });
});
最适用于:React、Node.js、通用JavaScript测试
  • 零配置启动
  • 内置断言与模拟功能
  • 快照测试
  • 并行测试执行
  • 代码覆盖率报告
javascript
// Jest example
describe('Calculator', () => {
  test('adds 1 + 2 to equal 3', () => {
    expect(add(1, 2)).toBe(3);
  });
  
  test('async operation', async () => {
    const result = await fetchData();
    expect(result).toEqual({ data: 'test' });
  });
});

Mocha

Mocha

Best for: Flexible testing needs, Node.js
  • Flexible and extensible
  • Async testing support
  • Rich ecosystem of plugins
  • Requires assertion library (Chai, Expect)
  • Requires mocking library (Sinon)
javascript
// Mocha example with Chai
const { expect } = require('chai');
const sinon = require('sinon');

describe('UserService', () => {
  it('should return user data', async () => {
    const user = await userService.getUser(1);
    expect(user).to.have.property('id', 1);
  });
});
最适用于:灵活测试需求、Node.js
  • 灵活且可扩展
  • 支持异步测试
  • 丰富的插件生态系统
  • 需要断言库(Chai、Expect)
  • 需要模拟库(Sinon)
javascript
// Mocha example with Chai
const { expect } = require('chai');
const sinon = require('sinon');

describe('UserService', () => {
  it('should return user data', async () => {
    const user = await userService.getUser(1);
    expect(user).to.have.property('id', 1);
  });
});

Vitest

Vitest

Best for: Vite projects, fast modern testing
  • Vite-native, extremely fast
  • Jest-compatible API
  • ESM support out of the box
  • TypeScript support
  • Watch mode with HMR
javascript
// Vitest example
import { describe, it, expect } from 'vitest';

describe('Math', () => {
  it('should add numbers', () => {
    expect(add(1, 2)).toBe(3);
  });
});
最适用于:Vite项目、快速现代测试
  • 原生适配Vite,速度极快
  • 兼容Jest的API
  • 开箱即用支持ESM
  • 支持TypeScript
  • 带HMR的监听模式
javascript
// Vitest example
import { describe, it, expect } from 'vitest';

describe('Math', () => {
  it('should add numbers', () => {
    expect(add(1, 2)).toBe(3);
  });
});

Jasmine

Jasmine

Best for: Traditional JavaScript testing
  • Behavior-driven development
  • No external dependencies
  • Simple syntax
  • Good for legacy projects
javascript
// Jasmine example
describe('Calculator', () => {
  it('should add numbers', () => {
    const result = add(1, 2);
    expect(result).toBe(3);
  });
});
最适用于:传统JavaScript测试
  • 行为驱动开发
  • 无外部依赖
  • 语法简单
  • 适用于遗留项目
javascript
// Jasmine example
describe('Calculator', () => {
  it('should add numbers', () => {
    const result = add(1, 2);
    expect(result).toBe(3);
  });
});

Python Testing Frameworks

Python测试框架

pytest

pytest

Best for: Python applications, flexible testing
  • Simple and intuitive syntax
  • Powerful fixtures
  • Plugin ecosystem
  • Parallel test execution
  • Code coverage integration
python
undefined
最适用于:Python应用、灵活测试
  • 简单直观的语法
  • 强大的夹具功能
  • 插件生态系统
  • 并行测试执行
  • 集成代码覆盖率
python
undefined

pytest example

pytest example

def test_addition(): assert add(1, 2) == 3
@pytest.fixture def user_data(): return {'id': 1, 'name': 'Test User'}
def test_user(user_data): assert user_data['name'] == 'Test User'
undefined
def test_addition(): assert add(1, 2) == 3
@pytest.fixture def user_data(): return {'id': 1, 'name': 'Test User'}
def test_user(user_data): assert user_data['name'] == 'Test User'
undefined

unittest

unittest

Best for: Standard library, traditional testing
  • Built into Python
  • xUnit-style testing
  • Test discovery
  • Mock library included
python
undefined
最适用于:标准库、传统测试
  • 内置在Python中
  • xUnit风格测试
  • 测试自动发现
  • 内置模拟库
python
undefined

unittest example

unittest example

import unittest
class TestCalculator(unittest.TestCase): def test_addition(self): result = add(1, 2) self.assertEqual(result, 3)
undefined
import unittest
class TestCalculator(unittest.TestCase): def test_addition(self): result = add(1, 2) self.assertEqual(result, 3)
undefined

nose2

nose2

Best for: Extending unittest
  • Extends unittest
  • Plugin system
  • Test discovery
  • Parallel execution
最适用于:扩展unittest
  • 扩展unittest功能
  • 插件系统
  • 测试自动发现
  • 并行执行

Java Testing Frameworks

Java测试框架

JUnit

JUnit

Best for: Java applications, standard testing
  • Industry standard
  • Annotations-based
  • Test runners
  • Parameterized tests
  • Integration with build tools
java
// JUnit 5 example
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {
    @Test
    void testAddition() {
        assertEquals(3, add(1, 2));
    }
}
最适用于:Java应用、标准测试
  • 行业标准
  • 基于注解
  • 测试运行器
  • 参数化测试
  • 与构建工具集成
java
// JUnit 5 example
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {
    @Test
    void testAddition() {
        assertEquals(3, add(1, 2));
    }
}

TestNG

TestNG

Best for: Advanced testing needs
  • More features than JUnit
  • Parallel execution
  • Data-driven testing
  • XML configuration
  • Integration with Selenium
java
// TestNG example
import org.testng.annotations.Test;
import static org.testng.Assert.*;

public class CalculatorTest {
    @Test
    public void testAddition() {
        assertEquals(add(1, 2), 3);
    }
}
最适用于:高级测试需求
  • 比JUnit具备更多功能
  • 并行执行
  • 数据驱动测试
  • XML配置
  • 与Selenium集成
java
// TestNG example
import org.testng.annotations.Test;
import static org.testng.Assert.*;

public class CalculatorTest {
    @Test
    public void testAddition() {
        assertEquals(add(1, 2), 3);
    }
}

Mockito

Mockito

Best for: Mocking in Java
  • Clean mocking API
  • Verification of interactions
  • Stubbing behavior
  • Integration with JUnit/TestNG
java
// Mockito example
import static org.mockito.Mockito.*;

List<String> mockList = mock(List.class);
when(mockList.get(0)).thenReturn("first");
assertEquals("first", mockList.get(0));
verify(mockList).get(0);
最适用于:Java中的模拟测试
  • 简洁的模拟API
  • 交互验证
  • 行为存根
  • 与JUnit/TestNG集成
java
// Mockito example
import static org.mockito.Mockito.*;

List<String> mockList = mock(List.class);
when(mockList.get(0)).thenReturn("first");
assertEquals("first", mockList.get(0));
verify(mockList).get(0);

Mobile Testing Frameworks

移动测试框架

Appium

Appium

Best for: Cross-platform mobile testing
  • Supports iOS and Android
  • Uses WebDriver protocol
  • Multiple language support
  • Native, hybrid, and mobile web apps
java
// Appium Java example
AppiumDriver driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), capabilities);
driver.findElement(By.id("username")).sendKeys("testuser");
driver.quit();
最适用于:跨平台移动测试
  • 支持iOS和Android
  • 使用WebDriver协议
  • 多语言支持
  • 原生、混合及移动Web应用
java
// Appium Java example
AppiumDriver driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), capabilities);
driver.findElement(By.id("username")).sendKeys("testuser");
driver.quit();

Espresso

Espresso

Best for: Android native testing
  • Android native
  • Fast and reliable
  • Synchronized with UI thread
  • Google-supported
java
// Espresso example
onView(withId(R.id.username))
    .perform(typeText("testuser"))
    .check(matches(withText("testuser")));
最适用于:Android原生应用测试
  • Android原生框架
  • 快速且可靠
  • 与UI线程同步
  • 谷歌官方支持
java
// Espresso example
onView(withId(R.id.username))
    .perform(typeText("testuser"))
    .check(matches(withText("testuser")));

XCUITest

XCUITest

Best for: iOS native testing
  • Apple native
  • Swift/Objective-C
  • Fast execution
  • Xcode integration
swift
// XCUITest example
let app = XCUIApplication()
app.textFields["username"].tap()
app.textFields["username"].typeText("testuser")
最适用于:iOS原生应用测试
  • Apple原生框架
  • Swift/Objective-C开发
  • 执行速度快
  • 与Xcode集成
swift
// XCUITest example
let app = XCUIApplication()
app.textFields["username"].tap()
app.textFields["username"].typeText("testuser")

API Testing Frameworks

API测试框架

Postman

Postman

Best for: Manual and automated API testing
  • User-friendly interface
  • Collections and environments
  • Test scripts
  • CI/CD integration
  • Mock servers
javascript
// Postman test script
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Response has data", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.data).to.exist;
});
最适用于:手动与自动化API测试
  • 友好的用户界面
  • 集合与环境管理
  • 测试脚本
  • 与CI/CD集成
  • 模拟服务器
javascript
// Postman test script
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Response has data", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.data).to.exist;
});

REST Assured

REST Assured

Best for: Java API testing
  • Fluent API
  • JSON/XML support
  • Authentication support
  • Integration with JUnit/TestNG
java
// REST Assured example
given()
    .header("Content-Type", "application/json")
    .body("{\"name\":\"test\"}")
.when()
    .post("/api/users")
.then()
    .statusCode(201)
    .body("name", equalTo("test"));
最适用于:Java API测试
  • 流畅式API
  • 支持JSON/XML
  • 身份验证支持
  • 与JUnit/TestNG集成
java
// REST Assured example
given()
    .header("Content-Type", "application/json")
    .body("{\"name\":\"test\"}")
.when()
    .post("/api/users")
.then()
    .statusCode(201)
    .body("name", equalTo("test"));

Supertest

Supertest

Best for: Node.js API testing
  • Express integration
  • Chai assertions
  • Easy to use
  • Good for testing Express apps
javascript
// Supertest example
const request = require('supertest');
const app = require('./app');

describe('API', () => {
  it('should create user', async () => {
    const res = await request(app)
      .post('/api/users')
      .send({ name: 'test' })
      .expect(201);
    expect(res.body.name).toBe('test');
  });
});
最适用于:Node.js API测试
  • 与Express集成
  • Chai断言支持
  • 易于使用
  • 适用于测试Express应用
javascript
// Supertest example
const request = require('supertest');
const app = require('./app');

describe('API', () => {
  it('should create user', async () => {
    const res = await request(app)
      .post('/api/users')
      .send({ name: 'test' })
      .expect(201);
    expect(res.body.name).toBe('test');
  });
});

Framework Selection Guidelines

框架选择指南

Web Testing

Web测试

  • Modern JavaScript apps: Cypress or Playwright
  • Cross-browser needs: Playwright or Selenium
  • Chrome-only: Puppeteer
  • Legacy apps: Selenium
  • 现代JavaScript应用:Cypress或Playwright
  • 跨浏览器需求:Playwright或Selenium
  • 仅Chrome:Puppeteer
  • 遗留应用:Selenium

Unit Testing

单元测试

  • JavaScript: Jest or Vitest
  • Python: pytest
  • Java: JUnit 5
  • .NET: xUnit or NUnit
  • JavaScript:Jest或Vitest
  • Python:pytest
  • Java:JUnit 5
  • .NET:xUnit或NUnit

Mobile Testing

移动测试

  • Cross-platform: Appium
  • Android only: Espresso
  • iOS only: XCUITest
  • 跨平台:Appium
  • 仅Android:Espresso
  • 仅iOS:XCUITest

API Testing

API测试

  • Java: REST Assured
  • Node.js: Supertest
  • Manual/Exploratory: Postman
  • Java:REST Assured
  • Node.js:Supertest
  • 手动/探索式测试:Postman