内容大纲
1. 自动化测试概述
自动化测试是指使用自动化工具和脚本执行测试用例的过程,旨在提高测试效率、减少人为错误、确保测试的一致性和可重复性。随着软件开发的快速发展,自动化测试已成为现代软件开发生命周期中的重要组成部分。
自动化测试的优势包括:
- 提高测试效率
- 减少人为错误
- 确保测试的一致性和可重复性
- 支持持续集成和持续部署
- 降低长期测试成本
- 提高测试覆盖率
更多学习教程www.fgedu.net.cn
2. 自动化测试类型
2.1 单元测试
$ npm install –save-dev jest
# 创建测试文件
$ cat sum.test.js
const sum = require(‘./sum’);
test(‘adds 1 + 2 to equal 3’, () => {
expect(sum(1, 2)).toBe(3);
});
test(‘adds 0 + 0 to equal 0’, () => {
expect(sum(0, 0)).toBe(0);
});
test(‘adds negative numbers’, () => {
expect(sum(-1, -2)).toBe(-3);
});
# 创建被测试文件
$ cat sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
# 运行测试
$ npx jest
# 查看测试结果
PASS ./sum.test.js
✓ adds 1 + 2 to equal 3 (5ms)
✓ adds 0 + 0 to equal 0 (1ms)
✓ adds negative numbers (1ms)
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Time: 1.023s
Ran all test suites.
2.2 集成测试
$ npm install –save-dev mocha chai supertest
# 创建测试文件
$ cat api.test.js
const request = require(‘supertest’);
const app = require(‘./app’);
const expect = require(‘chai’).expect;
describe(‘API Tests’, () => {
it(‘should return 200 for GET /api/users’, (done) => {
request(app)
.get(‘/api/users’)
.expect(200)
.end((err, res) => {
if (err) return done(err);
expect(res.body).to.be.an(‘array’);
done();
});
});
it(‘should create a new user’, (done) => {
request(app)
.post(‘/api/users’)
.send({ name: ‘Test User’, email: ‘test@fgedu.net.cn’ })
.expect(201)
.end((err, res) => {
if (err) return done(err);
expect(res.body).to.have.property(‘id’);
expect(res.body.name).to.equal(‘Test User’);
done();
});
});
});
# 创建应用文件
$ cat app.js
const express = require(‘express’);
const app = express();
app.use(express.json());
let users = [
{ id: 1, name: ‘User 1’, email: ‘user1@fgedu.net.cn’ },
{ id: 2, name: ‘User 2’, email: ‘user2@fgedu.net.cn’ }
];
app.get(‘/api/users’, (req, res) => {
res.json(users);
});
app.post(‘/api/users’, (req, res) => {
const newUser = {
id: users.length + 1,
name: req.body.name,
email: req.body.email
};
users.push(newUser);
res.status(201).json(newUser);
});
module.exports = app;
# 运行测试
$ npx mocha api.test.js
# 查看测试结果
API Tests
✓ should return 200 for GET /api/users
✓ should create a new user
2 passing (50ms)
风哥风哥提示:单元测试和集成测试是自动化测试的基础,它们分别测试代码的各个部分和组件之间的交互。
3. 自动化测试工具
3.1 Selenium
$ npm install –save-dev selenium-webdriver
# 创建测试文件
$ cat selenium.test.js
const { Builder, By, Key, until } = require(‘selenium-webdriver’);
async function testGoogleSearch() {
let driver = await new Builder().forBrowser(‘chrome’).build();
try {
// 打开Google
await driver.get(‘https://www.google.com’);
// 查找搜索框并输入内容
let searchBox = await driver.findElement(By.name(‘q’));
await searchBox.sendKeys(‘Selenium WebDriver’, Key.RETURN);
// 等待搜索结果
await driver.wait(until.titleContains(‘Selenium WebDriver’), 10000);
// 获取搜索结果数量
let results = await driver.findElements(By.css(‘h3’));
console.log(`Found ${results.length} results`);
// 验证结果
let firstResult = await results[0].getText();
console.log(`First result: ${firstResult}`);
} finally {
// 关闭浏览器
await driver.quit();
}
}
testGoogleSearch();
# 运行测试
$ node selenium.test.js
# 查看测试结果
Found 10 results
First result: Selenium WebDriver
3.2 Cypress
$ npm install –save-dev cypress
# 打开Cypress
$ npx cypress open
# 创建测试文件
$ cat cypress/integration/google_search.spec.js
describe(‘Google Search’, () => {
it(‘should search for Selenium WebDriver’, () => {
// 打开Google
cy.visit(‘https://www.google.com’);
// 查找搜索框并输入内容
cy.get(‘input[name=”q”]’).type(‘Selenium WebDriver{enter}’);
// 等待搜索结果
cy.title().should(‘include’, ‘Selenium WebDriver’);
// 验证结果
cy.get(‘h3’).should(‘have.length.at.least’, 1);
cy.get(‘h3’).first().should(‘be.visible’);
});
});
# 运行测试
$ npx cypress run
# 查看测试结果
====================================================================================================
(Run Finished)
Spec Tests Passing Failing Pending Skipped
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ✅ google_search.spec.js 1 1 0 – – │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
All specs passed! ✨
3.3 Playwright
$ npm install –save-dev playwright
# 创建测试文件
$ cat playwright.test.js
const { chromium } = require(‘playwright’);
async function testGoogleSearch() {
// 启动浏览器
const browser = await chromium.launch();
const page = await browser.newPage();
try {
// 打开Google
await page.goto(‘https://www.google.com’);
// 查找搜索框并输入内容
await page.fill(‘input[name=”q”]’, ‘Playwright’);
await page.press(‘input[name=”q”]’, ‘Enter’);
// 等待搜索结果
await page.waitForNavigation();
// 获取搜索结果数量
const results = await page.$$(‘h3’);
console.log(`Found ${results.length} results`);
// 验证结果
const firstResult = await page.textContent(‘h3’);
console.log(`First result: ${firstResult}`);
} finally {
// 关闭浏览器
await browser.close();
}
}
testGoogleSearch();
# 运行测试
$ node playwright.test.js
# 查看测试结果
Found 10 results
First result: Playwright
学习交流加群风哥微信: itpux-com
4. 测试框架
4.1 JUnit (Java)
$ cat CalculatorTest.java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3));
assertEquals(0, calculator.add(0, 0));
assertEquals(-1, calculator.add(-2, 1));
}
@Test
public void testSubtract() {
Calculator calculator = new Calculator();
assertEquals(1, calculator.subtract(3, 2));
assertEquals(0, calculator.subtract(5, 5));
assertEquals(-3, calculator.subtract(2, 5));
}
}
# 创建被测试类
$ cat Calculator.java
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a – b;
}
}
# 编译并运行测试
$ javac -cp junit-jupiter-api-5.8.2.jar:junit-jupiter-engine-5.8.2.jar:apiguardian-api-1.1.2.jar Calculator.java CalculatorTest.java
$ java -cp .:junit-jupiter-api-5.8.2.jar:junit-jupiter-engine-5.8.2.jar:apiguardian-api-1.1.2.jar:junit-platform-console-standalone-1.8.2.jar org.junit.runner.JUnitCore CalculatorTest
# 查看测试结果
JUnit version 4.13.2
..
Time: 0.02
OK (2 tests)
4.2 PyTest (Python)
$ pip install pytest
# 创建测试文件
$ cat test_calculator.py
def test_add():
from calculator import add
assert add(2, 3) == 5
assert add(0, 0) == 0
assert add(-2, 1) == -1
def test_subtract():
from calculator import subtract
assert subtract(3, 2) == 1
assert subtract(5, 5) == 0
assert subtract(2, 5) == -3
# 创建被测试文件
$ cat calculator.py
def add(a, b):
return a + b
def subtract(a, b):
return a – b
# 运行测试
$ pytest test_calculator.py -v
# 查看测试结果
============================= test session starts ==============================
platform linux — Python 3.8.10, pytest-7.1.2, pluggy-1.0.0
rootdir: /home/user
collected 2 items
test_calculator.py::test_add PASSED
test_calculator.py::test_subtract PASSED
============================== 2 passed in 0.02s ===============================
4.3 TestNG (Java)
$ cat CalculatorTest.java
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
assertEquals(calculator.add(2, 3), 5);
assertEquals(calculator.add(0, 0), 0);
assertEquals(calculator.add(-2, 1), -1);
}
@Test
public void testSubtract() {
Calculator calculator = new Calculator();
assertEquals(calculator.subtract(3, 2), 1);
assertEquals(calculator.subtract(5, 5), 0);
assertEquals(calculator.subtract(2, 5), -3);
}
}
# 编译并运行测试
$ javac -cp testng-7.5.jar Calculator.java CalculatorTest.java
$ java -cp .:testng-7.5.jar:jcommander-1.82.jar:guice-4.0.jar:bsh-2.0b4.jar org.testng.TestNG CalculatorTest.java
# 查看测试结果
[TestNG] Running: CalculatorTest.java
=============================================== CalculatorTest
Tests run: 2, Failures: 0, Skips: 0
===============================================
学习交流加群风哥QQ113257174
5. CI/CD集成
5.1 Jenkins集成
$ cat Jenkinsfile
pipeline {
agent any
stages {
stage(‘Checkout’) {
steps {
git branch: ‘master’, url: ‘https://github.com/fgedu/myapp.git’
}
}
stage(‘Build’) {
steps {
sh ‘npm install’
sh ‘npm run build’
}
}
stage(‘Test’) {
steps {
sh ‘npm test’
}
}
stage(‘Deploy’) {
steps {
sh ‘npm run deploy’
}
}
}
post {
success {
echo ‘Build successful!’
}
failure {
echo ‘Build failed!’
}
}
}
# 配置Jenkins
# 1. 安装Jenkins
# 2. 安装Node.js插件
# 3. 创建新的Pipeline任务
# 4. 配置Pipeline脚本从Git仓库获取
# 5. 保存并构建
# 查看构建结果
# 访问Jenkins控制台 -> 任务 -> 构建历史
5.2 GitHub Actions集成
$ cat .github/workflows/test.yml
name: Test
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v2
– name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: ’14’
– name: Install dependencies
run: npm install
– name: Run tests
run: npm test
# 提交代码到GitHub
$ git add .github/workflows/test.yml
$ git commit -m “Add GitHub Actions workflow”
$ git push
# 查看测试结果
# 访问GitHub仓库 -> Actions标签
5.3 GitLab CI/CD集成
$ cat .gitlab-ci.yml
stages:
– build
– test
– deploy
build:
stage: build
script:
– npm install
– npm run build
artifacts:
paths:
– build/
test:
stage: test
script:
– npm test
deploy:
stage: deploy
script:
– npm run deploy
only:
– master
# 提交代码到GitLab
$ git add .gitlab-ci.yml
$ git commit -m “Add GitLab CI/CD configuration”
$ git push
# 查看测试结果
# 访问GitLab仓库 -> CI/CD标签
更多学习教程公众号风哥教程itpux_com
6. 最佳实践
6.1 测试策略
- 制定明确的测试目标和范围
- 选择合适的测试工具和框架
- 建立测试用例管理系统
- 优先测试核心功能
- 定期更新测试用例
6.2 测试用例设计
$ cat test-cases.md
# 登录功能测试用例
## 测试用例1: 正常登录
– 测试步骤:
1. 打开登录页面
2. 输入正确的fgedu和密码
3. 点击登录按钮
– 预期结果:
– 登录成功
– 跳转到首页
– 显示用户信息
## 测试用例2: 错误密码
– 测试步骤:
1. 打开登录页面
2. 输入正确的fgedu和错误的密码
3. 点击登录按钮
– 预期结果:
– 登录失败
– 显示错误提示信息
## 测试用例3: 空fgedu
– 测试步骤:
1. 打开登录页面
2. 输入空fgedu和正确的密码
3. 点击登录按钮
– 预期结果:
– 显示fgedu不能为空的提示
## 测试用例4: 空密码
– 测试步骤:
1. 打开登录页面
2. 输入正确的fgedu和空密码
3. 点击登录按钮
– 预期结果:
– 显示密码不能为空的提示
6.3 测试自动化最佳实践
- 保持测试用例的独立性
- 使用数据驱动测试
- 实现测试环境的自动化部署
- 使用Page Object模式
- 定期运行测试套件
- 监控测试覆盖率
- 集成测试到CI/CD流程
- 使用版本控制管理测试代码
- 编写清晰的测试报告
- 持续优化测试性能
7. 案例分析
7.1 电商平台自动化测试
某电商平台通过以下措施实现了自动化测试:
- 使用Selenium进行UI测试
- 使用Jest进行单元测试
- 使用Postman进行API测试
- 集成Jenkins实现CI/CD
- 建立测试用例管理系统
结果:
- 测试时间从2天减少到2小时
- 缺陷发现率提高了40%
- 发布周期从2周缩短到1周
7.2 金融系统自动化测试
某金融系统通过以下措施实现了自动化测试:
- 使用TestNG进行单元测试和集成测试
- 使用Cypress进行UI测试
- 使用JMeter进行性能测试
- 集成GitHub Actions实现CI/CD
- 建立自动化测试框架
结果:
- 测试覆盖率达到90%
- 系统稳定性提高了30%
- 回归测试时间减少了80%
8. 性能测试
8.1 JMeter性能测试
$ wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.3.tgz
$ tar -xzf apache-jmeter-5.4.3.tgz
$ cd apache-jmeter-5.4.3
# 创建测试计划
$ cat test-plan.jmx
true
# 运行测试
$ ./bin/jmeter -n -t test-plan.jmx -l results.jtl
# 查看测试结果
$ ./bin/jmeter -g results.jtl -o report
# 打开报告目录中的index.html文件
8.2 LoadRunner性能测试
$ cat web_test.lrs
Action()
{
web_url(“Example”,
“URL=http://fgedu.net.cn”,
“Resource=0”,
“RecContentType=text/html”,
“Referer=”,
“Snapshot=t1.inf”,
“Mode=HTML”,
LAST);
return 0;
}
# 配置LoadRunner场景
# 1. 打开LoadRunner Controller
# 2. 创建新场景
# 3. 添加脚本
# 4. 配置虚拟用户数和运行时间
# 5. 运行场景
# 查看测试结果
# LoadRunner Analysis
author:www.itpux.com
9. 安全测试
9.1 OWASP ZAP安全测试
$ wget https://github.com/zaproxy/zaproxy/releases/download/v2.11.1/ZAP_2.11.1_Linux.tar.gz
$ tar -xzf ZAP_2.11.1_Linux.tar.gz
$ cd ZAP_2.11.1
# 运行ZAP
$ ./zap.sh
# 使用ZAP进行安全扫描
# 1. 打开ZAP
# 2. 点击”Quick Start”标签
# 3. 输入目标URL
# 4. 点击”Attack”
# 查看扫描结果
# ZAP界面 -> Alerts标签
# 使用ZAP API
$ curl -X POST “http://fgedudb:8080/JSON/core/action/accessUrl” \
-d ‘{“url”:”http://fgedu.net.cn”,”followRedirects”:true}’
$ curl -X POST “http://fgedudb:8080/JSON/ascan/action/scan” \
-d ‘{“url”:”http://fgedu.net.cn”,”recurse”:true,”inScopeOnly”:true,”scanPolicyName”:””,”method”:”POST”,”postData”:””}’
# 查看扫描状态
$ curl “http://fgedudb:8080/JSON/ascan/view/status?id=1”
9.2 Burp Suite安全测试
# 从官网下载并安装Burp Suite
# 配置Burp Suite
# 1. 打开Burp Suite
# 2. 配置代理设置
# 3. 配置浏览器使用Burp代理
# 进行安全测试
# 1. 浏览目标网站
# 2. 使用Burp Scanner进行扫描
# 3. 查看扫描结果
# 使用Burp Intruder进行暴力破解
# 1. 选择请求
# 2. 发送到Intruder
# 3. 配置攻击类型和payload
# 4. 开始攻击
# 使用Burp Repeater进行请求修改
# 1. 选择请求
# 2. 发送到Repeater
# 3. 修改请求
# 4. 发送请求并查看响应
10. 移动应用测试
10.1 Appium移动应用测试
$ npm install -g appium
$ npm install -g appium-doctor
# 检查Appium环境
$ appium-doctor
# 创建测试脚本
$ cat appium-test.js
const wd = require(‘wd’);
async function testCalculator() {
// 配置Appium
const driver = await wd.promiseChainRemote({
host: ‘fgedudb’,
port: 4723
});
// 启动应用
await driver.init({
platformName: ‘Android’,
platformVersion: ’11’,
deviceName: ’emulator-5554′,
app: ‘/path/to/calculator.apk’,
automationName: ‘UiAutomator2’
});
try {
// 点击数字按钮
await driver.elementById(‘com.android.calculator2:id/digit_2’).click();
await driver.elementById(‘com.android.calculator2:id/op_add’).click();
await driver.elementById(‘com.android.calculator2:id/digit_3’).click();
await driver.elementById(‘com.android.calculator2:id/eq’).click();
// 获取结果
const result = await driver.elementById(‘com.android.calculator2:id/result’).text();
console.log(`Result: ${result}`);
// 验证结果
if (result === ‘5’) {
console.log(‘Test passed!’);
} else {
console.log(‘Test failed!’);
}
} finally {
// 关闭应用
await driver.quit();
}
}
testCalculator();
# 启动Appium服务器
$ appium
# 运行测试
$ node appium-test.js
# 查看测试结果
Result: 5
Test passed!
10.2 Espresso Android测试
# 1. 打开Android Studio
# 2. 创建新项目
# 3. 添加Espresso依赖
# 创建测试类
$ cat CalculatorTest.java
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
public class CalculatorTest {
@Rule
public ActivityScenarioRule
new ActivityScenarioRule<>(MainActivity.class);
@Test
public void testAddition() {
// 点击数字2
onView(withId(R.id.digit_2)).perform(click());
// 点击加号
onView(withId(R.id.op_add)).perform(click());
// 点击数字3
onView(withId(R.id.digit_3)).perform(click());
// 点击等号
onView(withId(R.id.eq)).perform(click());
// 验证结果
onView(withId(R.id.result)).check(matches(withText(“5″)));
}
}
# 运行测试
# 1. 在Android Studio中右键点击测试类
# 2. 选择”Run ‘CalculatorTest'”
# 查看测试结果
# Android Studio -> Run窗口
生产环境建议
- 建立完善的自动化测试策略
- 选择合适的测试工具和框架
- 集成测试到CI/CD流程
- 定期运行测试套件
- 监控测试覆盖率
- 持续优化测试性能
- 培训团队掌握自动化测试技能
- 建立测试用例管理系统
- 定期更新测试用例
- 使用版本控制管理测试代码
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
