自动化测试- 自动化测试模型
目录
自动化测试模型简介
1、线性模型
举例
测试页面html文件
测试脚本
2. 关键字驱动测试(Keyword-Driven Testing)
需测试内容
关键字驱动测试框架
创建测试用例文件
运行测试
3. 数据驱动测试(Data-Driven Testing)
举例
4. 行为驱动开发(Behavior-Driven Development, BDD)
测试举例
环境准备
创建特性文件
创建步骤定义文件
运行测试
测试报告
5. 模块化测试(Modular Testing)
功能模块测试举例
创建测试模块
5. 回归测试(Regression Testing)
简单示例
6. 持续集成测试(Continuous Integration Testing)
自动化测试模型简介
自动化测试模型是指在软件测试过程中,采用特定的方法和策略来实现测试的自动化。不同的自动化测试模型适用于不同的测试需求和场景。
1、线性模型
自动化测试线性模型是通过录制或编写脚本,一个脚本完成一个场景(一组完整功能操作),通过对脚本的回放进行自动化测试。这种模型通过模拟用户完整的操作场景,每个脚本相对独立,且不产生其他依赖和调用。
优点: 独立性:每个脚本相互独立,任何一个脚本文件拿出来就能单独运行。简单性:对于简单的测试场景,开发和维护成本较低。
缺点:开发成本高:用例之间存在重复的操作,如重复的用户登录和退出,导致开发成本较高。
维护成本高:当重复的操作发生改变时,需要逐一修改脚本,维护成本较高。复用性差:数据和脚本混在一起,用例的复用性较差。
应用场景:线性模型适用于简单的功能测试场景,特别是那些不需要复杂逻辑处理的测试用例。例如,登录、注册、提交表单等操作都可以通过线性模型来实现。
举例
测试页面html文件
<html>
<head>
<meta charset="utf-8" />
<meta content="IE=edge">
<title>第一个项目</title>
<link rel="stylesheet" type="text/css" href="index.css" />
</head>
<body>
<div id="main">
<h1>第一个项目</h1>
<div class="mail-login">
<input id="email" name="email" type="text" placeholder="输入手机号或邮箱">
<input type="password" name="password" placeholder="密码">
<a id="btn-login" href="#" type="button" onclick="alert('登录成功')">
<span class="text">登 录</span>
</a>
</div>
<div id="forget-pwd">
<a class="forget-pwd" href="#">忘记密码>></a>
</div>
<div id="register">
<span class="no-account"></span>还没有账号?</span>
<a class="register" href="#">点击注册>></a>
</div>
</div>
</body>
</html>
测试脚本
每一步都有对应,代码复用性差
from selenium import webdriver #导入webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 创建Chrome浏览器对象
browser.get('file:///E:/t.html') # 加载指定的页面
time.sleep(1)
browser.find_element(By.ID,'email').send_keys('test@test.com') #定位操作元素输入内容
browser.find_element(By.NAME,'password').send_keys('abc123')
browser.find_element(By.ID,'btn-login').click() #单击元素
time.sleep(6)
browser.quit()
2. 关键字驱动测试(Keyword-Driven Testing)
概述:关键字驱动测试是一种将测试用例的逻辑与测试数据分离的方法。测试用例通过关键字(通常是操作或功能的名称)来描述,测试框架根据关键字执行相应的操作。示例:使用关键字如 "登录"、"搜索"、"添加到购物车" 来描述测试步骤。关键字驱动框架会根据这些关键字调用相应的函数或方法。
需测试内容
calculator.py
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
def multiply(self, a, b):
return a * b
def divide(self, a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
关键字驱动测试框架
keyword_driver.py
import csv
from calculator import Calculator
class KeywordDriver:
def __init__(self):
self.calculator = Calculator()
def execute_keyword(self, keyword, *args):
if keyword == "ADD":
return self.calculator.add(*map(float, args))
elif keyword == "SUBTRACT":
return self.calculator.subtract(*map(float, args))
elif keyword == "MULTIPLY":
return self.calculator.multiply(*map(float, args))
elif keyword == "DIVIDE":
return self.calculator.divide(*map(float, args))
else:
raise ValueError(f"Unknown keyword: {keyword}")
def run_tests(self, test_file):
with open(test_file, mode='r') as file:
reader = csv.reader(file)
for row in reader:
keyword = row[0]
args = row[1:]
try:
result = self.execute_keyword(keyword, *args)
print(f"Keyword: {keyword}, Args: {args}, Result: {result}")
except Exception as e:
print(f"Keyword: {keyword}, Args: {args}, Error: {e}")
if __name__ == "__main__":
driver = KeywordDriver()
driver.run_tests('test_cases.csv')
创建测试用例文件
创建一个 CSV 文件 test_cases.csv,用于存储测试用例。
ADD,1,2
SUBTRACT,5,3
MULTIPLY,4,2
DIVIDE,8,2
DIVIDE,8,0
运行测试
结果
Keyword: ADD, Args: ['1', '2'], Result: 3.0
Keyword: SUBTRACT, Args: ['5', '3'], Result: 2.0
Keyword: MULTIPLY, Args: ['4', '2'], Result: 8.0
Keyword: DIVIDE, Args: ['8', '2'], Result: 4.0
Keyword: DIVIDE, Args: ['8', '0'], Error: Cannot divide by zero
3. 数据驱动测试(Data-Driven Testing)
概述:数据驱动测试是一种通过外部数据源(如 CSV、Excel、数据库等)来驱动测试用例执行的方法。测试逻辑与测试数据分离,使得同一测试用例可以使用不同的数据集进行多次测试。示例:使用一个 Excel 文件存储测试输入和预期输出,测试框架读取这些数据并执行测试。例如,测试用户登录功能时,可以使用不同的用户名和密码组合进行测试。
举例
自动化测试- 数据驱动测试-CSDN博客
4. 行为驱动开发(Behavior-Driven Development, BDD)
概述:BDD 是一种软件开发方法,强调通过自然语言描述软件的行为来驱动开发和测试。测试用例通常以 "Given-When-Then" 的格式编写,使得非技术人员也能理解。示例:使用工具如 Cucumber 或 Behave,编写如下测试用例:Given 用户在登录页面 ;When 用户输入有效的用户名和密码;Then 用户应该成功登录。
测试举例
环境准备
pip install Behave
创建被测试的模块calculator.py
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
创建特性文件
特性文件使用 Gherkin 语言编写,描述了软件的行为。创建一个名为 calculator.feature 的文件。
Feature: Calculator
Scenario: Add two numbers
Given I have a calculator
When I add 5 and 3
Then the result should be 8
Scenario: Subtract two numbers
Given I have a calculator
When I subtract 5 from 3
Then the result should be -2
创建步骤定义文件
步骤定义文件将特性文件中的步骤与实际代码连接起来。创建一个名为 steps/calculator_steps.py 的文件。
from behave import given, when, then
from calculator import Calculator
@given('I have a calculator')
def step_given_i_have_a_calculator(context):
context.calc = Calculator()
@when('I add {a:d} and {b:d}')
def step_when_i_add(context, a, b):
context.result = context.calc.add(a, b)
@when('I subtract {a:d} from {b:d}')
def step_when_i_subtract(context, a, b):
context.result = context.calc.subtract(b, a)
@then('the result should be {expected:d}')
def step_then_the_result_should_be(context, expected):
assert context.result == expected
运行测试
在命令行中,导航到包含 features 目录的项目根目录,然后运行以下命令 behave
被测试的模块:calculator.py 定义了一个简单的 Calculator 类,包含加法和减法的方法。
特性文件:calculator.feature 描述了计算器的行为,包括两个场景:加法和减法。
步骤定义文件:calculator_steps.py 中定义了如何实现特性文件中的每个步骤。
@given 装饰器定义了初始状态。
@when 装饰器定义了操作。
@then 装饰器定义了期望的结果。
运行测试:使用 behave 命令运行所有测试用例。
测试报告
pip install allure-behave
生成测试报告: allure generate ./result/ -o .\report\ --clean
5. 模块化测试(Modular Testing)
概述:模块化测试将测试用例分解为多个独立的模块,每个模块负责特定的功能或操作。这种方法提高了测试的可重用性和可维护性。示例:将登录、搜索、添加到购物车等功能分别封装为独立的测试模块。在测试中调用这些模块,组合成完整的测试用例。
功能模块测试举例
calculator.py
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
def multiply(self, a, b):
return a * b
def divide(self, a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
创建测试模块
测试模块:test_calculator.py 中定义了多个测试类,每个类负责测试 Calculator 类的一个功能。
TestCalculatorAdd 测试加法功能。 TestCalculatorSubtract 测试减法功能。
TestCalculatorMultiply 测试乘法功能。 TestCalculatorDivide 测试除法包括对除以零的异常处理
模块测试向标准的测试架构有很多文件目录case存放所有用例,report存放测试报告等等
# test_calculator.py
import unittest
from calculator import Calculator
class TestCalculatorAdd(unittest.TestCase):
def setUp(self):
self.calc = Calculator()
def test_add(self):
self.assertEqual(self.calc.add(1, 2), 3)
self.assertEqual(self.calc.add(-1, 1), 0)
self.assertEqual(self.calc.add(0, 0), 0)
class TestCalculatorSubtract(unittest.TestCase):
def setUp(self):
self.calc = Calculator()
def test_subtract(self):
self.assertEqual(self.calc.subtract(5, 3), 2)
self.assertEqual(self.calc.subtract(-1, -1), 0)
self.assertEqual(self.calc.subtract(0, 1), -1)
class TestCalculatorMultiply(unittest.TestCase):
def setUp(self):
self.calc = Calculator()
def test_multiply(self):
self.assertEqual(self.calc.multiply(4, 2), 8)
self.assertEqual(self.calc.multiply(-1, 1), -1)
self.assertEqual(self.calc.multiply(0, 5), 0)
class TestCalculatorDivide(unittest.TestCase):
def setUp(self):
self.calc = Calculator()
def test_divide(self):
self.assertEqual(self.calc.divide(8, 2), 4)
self.assertEqual(self.calc.divide(-8, 2), -4)
with self.assertRaises(ValueError):
self.calc.divide(8, 0)
if __name__ == "__main__":
unittest.main()
6. 回归测试(Regression Testing)
概述:回归测试是一种验证软件修改后是否影响现有功能的测试方法。自动化回归测试可以快速执行大量测试用例,确保软件的稳定性。示例:在每次代码提交后,自动运行一组回归测试用例,检查新代码是否引入了错误。
简单示例
基于功能模块测试举例基础上
假设对 Calculator 类进行了修改,比如添加了一个新的功能(例如取余),需要确保现有的功能仍然正常工作。只需在 calculator.py 中添加新功能,并在 test_calculator.py 中添加相应的测试用例
修改后的 calculator.py
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
def multiply(self, a, b):
return a * b
def divide(self, a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
def modulus(self, a, b):
return a % b
在 test_calculator.py添加对新功能测试case
class TestCalculatorModulus(unittest.TestCase):
def setUp(self):
self.calc = Calculator()
def test_divide(self):
self.assertEqual(self.calc.modulus(5, 2), 1)
self.assertEqual(self.calc.modulus(10, 3), 1)
7. 持续集成测试(Continuous Integration Testing)
概述:持续集成测试是在持续集成环境中自动执行的测试,确保每次代码更改后,软件仍然能够正常工作。示例:使用 CI/CD 工具(如 Jenkins、GitLab CI)自动运行测试用例,确保每次代码提交后都进行测试。
1、创建被测试的模块 calculator.py
2、创建测试模块 test_calculator.py
3、创建 GitHub Actions 工作流
# .github/workflows/ci.yml
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
python -m unittest discover
GitHub Actions 工作流:
on 部分定义了在 main 分支的推送和拉取请求时触发 CI 测试。
jobs 部分定义了一个名为 test 的作业,运行在最新的 Ubuntu 环境上。
steps 部分包括检查代码、设置 Python 环境、安装依赖和运行测试的步骤。
4、创建 requirements.txt 文件,如果项目有依赖项,可以创建一个 requirements.txt 文件。
5、提交代码并触发 CI 测试,提交代码:将代码推送到 GitHub 后,CI 测试将自动运行。