自动化测试- 自动化测试模型

目录

自动化测试模型简介

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 + bdef subtract(self, a, b):return a - bdef multiply(self, a, b):return a * bdef divide(self, a, b):if b == 0:raise ValueError("Cannot divide by zero")return a / b

关键字驱动测试框架

keyword_driver.py

import csv
from calculator import Calculatorclass 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 + bdef subtract(self, a, b):return a - b

创建特性文件

特性文件使用 Gherkin 语言编写,描述了软件的行为。创建一个名为 calculator.feature 的文件。

Feature: CalculatorScenario: Add two numbersGiven I have a calculatorWhen I add 5 and 3Then the result should be 8Scenario: Subtract two numbersGiven I have a calculatorWhen I subtract 5 from 3Then 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 + bdef subtract(self, a, b):return a - bdef multiply(self, a, b):return a * bdef 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 + bdef subtract(self, a, b):return a - bdef multiply(self, a, b):return a * bdef divide(self, a, b):if b == 0:raise ValueError("Cannot divide by zero")return a / bdef 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: CIon:push:branches:- mainpull_request:branches:- mainjobs:test:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Set up Pythonuses: actions/setup-python@v2with:python-version: '3.8'- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txt- name: Run testsrun: |python -m unittest discover

GitHub Actions 工作流:
on 部分定义了在 main 分支的推送和拉取请求时触发 CI 测试。
jobs 部分定义了一个名为 test 的作业,运行在最新的 Ubuntu 环境上。
steps 部分包括检查代码、设置 Python 环境、安装依赖和运行测试的步骤。 

4、创建 requirements.txt 文件,如果项目有依赖项,可以创建一个 requirements.txt 文件。

5、提交代码并触发 CI 测试,提交代码:将代码推送到 GitHub 后,CI 测试将自动运行。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】091:根据指定字段融合图斑(字段值相同融合到一起)

文章目录 一、加载数据二、符号化三、融合图斑1. 根据图斑位置进行融合2. 根据指定字段四、注意事项一、加载数据 订阅专栏后,从私信中查收配套实验数据包,找到data091.rar,解压并加载,如下图所示: 属性表如下: 二、符号化 为了便于比对不同的融合结果,查看属性表根据…

strace工具使用

下载地址&#xff1a; https://github.com/strace/strace/releases/tag/v6.12 解压后执行以下命令 ./configure --hostarm-linux --prefix/home/wei/Code/strace/strace-6.12/out CC/home/wei/Code/firmware/prebuilts/host/gcc/gcc-arm-10.2-2020.11-x86_64-arm-none-linux…

图像处理-Ch2-空间域的图像增强

Ch2 空间域的图像增强 文章目录 Ch2 空间域的图像增强Background灰度变换函数(Gray-level Transformation)对数变换(Logarithmic)幂律变换(Power-Law)分段线性变换函数(Piecewise-Linear)对比度拉伸(Contrast-Stretching)灰度级分层(Gray-level Slicing) 直方图处理(Histogram …

Linux | Ubuntu零基础安装学习cURL文件传输工具

目录 介绍 检查安装包 下载安装 手册 介绍 ‌cURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;首次发行于1997年‌‌12。cURL支持多种协议&#xff0c;包括FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3…

cesium通过经纬度获取3dtiles 得feature信息

找到这里3dtiles的两种访问方式&#xff1a; 1.1 3DTileContent#getFeature 这里涉及3DTile 数据结构&#xff0c;暂不了解3DTile 数据结构&#xff0c;因此暂不使用。 1.2 scene.pick 本次使用 scene表示虚拟场景中所有 3D 图形对象和状态的容器&#xff1b;scene中…

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC&#xff08;自动电平控制&#xff09;的前置音频放大器芯片&#xff0c;最初产品为单声道/立体声收录机及盒式录音机而开发&#xff0c;作为录音/回放的磁头放大器使用&#xff1b;由于产品的高增益、低噪声及ALC外部可调的特性&…

基于SSM的“快递管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“快递管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登陆页面 注册页面 快递员页面 派单员订单管理页面 派单员订单添…

frp(s) 内网穿透 Liunx环境双端Docker部署

FRP(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透、负载均衡和反向代理等多种场景。它能够将内网中的服务暴露给公网,实现远程访问。此外,FRP还可以用于接收类似GitHub或第三方提供的Webhook请求。在微服务架构中,FRP可以作为服务调用的反向代理,提…

STM32F103RCT6学习之五:ADC

1.ADC基础 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a;0~3.3V&#xff…

实现类似gpt 打字效果

1. css的动画&#xff08;animation) css中实现动画有两种方式&#xff1a;transition过渡动画、 animation自定义动画。 具体的可以看MDN链接&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/CSS/animation 使用keyframes自定义关键帧动画并未其命名使用自定义动…

微软远程桌面APP怎么用

微软远程桌面&#xff08;Remote Desktop&#xff09;客户端&#xff08;RD Client&#xff09;是一款由微软开发的应用程序&#xff0c;允许用户通过网络连接远程访问和控制另一台计算机。同时&#xff0c;微软远程桌面RD Client支持多种设备和操作系统&#xff0c;包括Window…

Unity3d UGUI如何优雅的实现Web框架(Vue/Rect)类似数据绑定功能(含源码)

前言 Unity3d的UGUI系统与Web前端开发中常见的数据绑定和属性绑定机制有所不同。UGUI是一个相对简单和基础的UI系统&#xff0c;并不内置像Web前端&#xff08;例如 Vue.js或React中&#xff09;那样的双向数据绑定或自动更新UI的机制。UGUI是一种比较传统的 UI 系统&#xff…

10分钟掌握项目管理核心工具:WBS、甘特图、关键路径法全解析

一、引言 在项目管理的广阔天地里&#xff0c;犹如一场精心编排的交响乐演奏&#xff0c;每个乐器、每个音符都需精准配合才能奏响美妙乐章。而 WBS&#xff08;工作分解结构&#xff09;、甘特图、关键路径法无疑是这场交响乐中的关键乐章&#xff0c;它们从不同维度为项目管…

代码思想之快慢路径

处理业务代码的过程中&#xff0c;对业务代码有了一些调整&#xff0c;后续发现这是一种代码思想 在一段复杂的逻辑里&#xff0c;我把查询redis操作写在了前面&#xff0c; 业务逻辑&#xff1a; 如果需要不打压就退出本次处理 查询redis拿到商品需要打压的次数 如果次数 …

纯 HTML+CSS+JS 实现一个炫酷的圣诞树动画特效

纯 HTMLCSSJS 实现一个炫酷的圣诞树动画特效 前言 圣诞节快到了&#xff0c;今天给大家带来一个简单但是效果不错的圣诞树动画特效。这个特效完全使用原生 HTML、CSS 和 JavaScript 实现&#xff0c;包含闪烁的星星、随机彩灯等元素&#xff0c;非常适合节日气氛&#xff01;…

【RAG实战】语言模型基础

语言模型赋予了计算机理解和生成人类语言的能力。它结合了统计学原理和深度神经网络技术&#xff0c;通过对大量的样本数据进行复杂的概率分布分析来学习语言结构的内在模式和相关性。具体地&#xff0c;语言模型可根据上下文中已出现的词序列&#xff0c;使用概率推断来预测接…

富芮坤FR800X系列之PWM输出程序应用设计

文章目录 前言1.设计背景2.简介3.如何设计控制调光的接口呢4.硬件设计5.软件设计5.1.软件流程图5.2.软件代码 6.小结 前言 版权归作者所有、未经允许、请勿转载。 读者对象&#xff1a; 本文档主要适用以下工程师&#xff1a; 嵌入式系统工程师 单片机软件工程师 IOT固…

Ftrans数据摆渡系统 搭建安全便捷跨网文件传输通道

一、专业数据摆渡系统对企业的意义 专业的数据摆渡系统对企业具有重要意义&#xff0c;主要体现在以下几个方面‌&#xff1a; 1、‌数据安全性‌&#xff1a;数据摆渡系统通过加密传输、访问控制和审计日志等功能&#xff0c;确保数据在传输和存储过程中的安全性。 2、‌高…

EasyPoi 使用$fe:模板语法生成Word动态行

1 Maven 依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version> </dependency> 2 application.yml spring:main:allow-bean-definition-over…

python 渗透开发工具之SQLMapApi Server不同IP服务启动方式处理 解决方案SqlMapApiServer外网不能访问的情况

目录 说在前面 什么是 SQLMapAPI 说明 sqlmapApi能干什么 sqlmapApi 服务安装相关 kali-sqlmap存放位置 正常启动sqlmap-api server SqlMapApi-Server 解决外网不能访问情况 说在前面 什么是sqlmap 这个在前面已经说过了&#xff0c;如果这个不知道&#xff0c;就可以…