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

目录

自动化测试模型简介

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()

5. 回归测试(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)

6. 持续集成测试(Continuous Integration Testing)

概述:持续集成测试是在持续集成环境中自动执行的测试,确保每次代码更改后,软件仍然能够正常工作。示例:使用 CI/CD 工具(如 Jenkins、GitLab CI)自动运行测试用例,确保每次代码提交后都进行测试。


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)

1. 开发需求 在参考图像中定义感兴趣区域&#xff08;ROI&#xff09;&#xff0c;用于形状匹配和文本识别。通过形状匹配找到图像中的目标对象位置。对齐多幅输入图像&#xff0c;使其与参考图像保持一致。在对齐后的图像上进行OCR识别&#xff0c;提取文本和数字信息。以循环…

快速理解24种设计模式

简单工厂模式 建立产品接口类&#xff0c;规定好要实现方法。 建立工厂类&#xff0c;根据传入的参数&#xff0c;实例化所需的类&#xff0c;实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例&#xff0c;并提供一个访问他它的全局…

CKA认证 | Day7 K8s存储

第七章 Kubernetes存储 1、数据卷与数据持久卷 为什么需要数据卷&#xff1f; 容器中的文件在磁盘上是临时存放的&#xff0c;这给容器中运行比较重要的应用程序带来一些问题。 问题1&#xff1a;当容器升级或者崩溃时&#xff0c;kubelet会重建容器&#xff0c;容器内文件会…

【JavaEE进阶】@RequestMapping注解

目录 &#x1f4d5;前言 &#x1f334;项目准备 &#x1f332;建立连接 &#x1f6a9;RequestMapping注解 &#x1f6a9;RequestMapping 注解介绍 &#x1f384;RequestMapping是GET还是POST请求&#xff1f; &#x1f6a9;通过Fiddler查看 &#x1f6a9;Postman查看 …

ROUGE指标在自然语言处理中的应用:从理论到实践

引言 你是否曾经遇到过机器生成的文本摘要与原文内容不符的情况&#xff1f;或者在使用机器翻译时&#xff0c;发现译文虽然“看起来”正确&#xff0c;但语义却与原文相差甚远&#xff1f;在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;如何科学地评估生成文本的…

编译openssl遇到错误Parse errors: No plan found in TAP output的解决方法

在编译openssl时 tar -zxvf openssl-1.1.1p.tar.gz cd openssl-1.1.1p ./config --prefix/usr --openssldir/etc/ssl --shared zlib make make test 遇到错误 Parse errors: No plan found in TAP output 解决方法&#xff1a; yum install perl-Test-Simple

Visual Studio 2017 配置 OpenCV 4.5.5 及二次配置的导入

重点参考&#xff1a; Visual Studio 2017 OpenCV_4.5.0安装_opencv4.5.0下载-CSDN博客 VS2017配置OpenCV4.5_vs2017 opencv4.5.4-CSDN博客 下载准备工作就不说了&#xff0c;直接从官网下载就行了。 关键就两步&#xff1a; 1&#xff09;将OpenCV的bin目录添加到环境变量…

42 模板进阶

目录 一、非类型形参 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;非类型形参与宏的区别 &#xff08;三&#xff09;注意点 二、模板的特化 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;函数模板的特化 &#xff08;三&#xff…

接口测试面试题

接口测试在软件测试中占据重要位置&#xff0c;无论是功能测试还是性能测试&#xff0c;接口的稳定性至关重要。以下总结了一些常见的接口测试面试题&#xff0c;帮助你从容应对面试挑战&#xff01; 面试官常说&#xff1a;“接口测试是测试的重头戏&#xff0c;了解接口的设计…

使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图

在做一些尺度分析时&#xff0c;经常会涉及到对研究区构建不同尺度的渔网进行分析&#xff0c;渔网的形状通常为规则四边形。构建渔网的方法也很简单&#xff0c;使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…

在Linux上获取MS(如Media Server)中的RTP流并录制为双轨PCM格式的WAV文件

在Linux上获取MS(如Media Server)中的RTP流并录制为双轨PCM格式的WAV文件 一、RTP流与WAV文件格式二、实现步骤三、伪代码示例四、C语言示例代码五、关键点说明六、总结在Linux操作系统上,从媒体服务器(如Media Server,简称MS)获取RTP(Real-time Transport Protocol)流…

Docker 是什么? Docker 基本观念介绍与容器和虚拟机的比较

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构&#xff1a;List、Set和Queue。本文将详细阐述这些数据类型的各自实现&#xff0c;并按照线程安全性进行分类&#xff0c;分别介绍非线程安全与线程安全的实现方…

人工智能知识分享第二天-机器学习之KNN算法

KNN算法 KNN算法简介 KNN算法思想 K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;。比如&#xff1a;根据你的“邻居”来推断出你的类别 KNN算法思想&#xff1a;如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别&#xff…

b站ip属地评论和主页不一样怎么回事

在浏览B站时&#xff0c;细心的用户可能会发现一个有趣的现象&#xff1a;某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测&#xff0c;究竟是什么原因导致了这种情况的发生呢&#xff1f;本文将对此进行深入解析&#xff0c;帮助大家揭开这一…

Robyn+Vue3+wangEditor打造个人笔记

Github&#xff1a;https://github.com/gwt805/MYNotes Gitee: https://gitee.com/gwt805/MYNotes GitCode: https://gitcode.com/gwt805/MYNotes/overview

BGP路由反射器,解决路由黑洞问题

路由反射器解决路由黑洞问题 路由反射器解决路由黑洞问题 路由黑洞的产生路由黑洞的解决办法路由反射器解决黑洞问题基本配置配置反射器前查看路由配置路由反射器配置反射器后查看路由路由黑洞的产生 根据BGP建立邻居的规则,只要TCP可达便可建立邻居系。如下图所示: AR2、AR…

JavaFX FXML模式下的布局

常见布局方式概述 在 JavaFX FXML 模式下&#xff0c;有多种布局方式可供选择。这些布局方式可以帮助您有效地组织和排列 UI 组件&#xff0c;以创建出美观且功能良好的用户界面。常用布局容器及布局方式 BorderPane 布局 特点&#xff1a;BorderPane 将空间划分为五个区域&…

二叉树的深搜_求根节点到叶节点数字之和_验证二叉搜索树_二叉树的所有路径

2331. 计算布尔二叉树的值 二叉树遍历可以用递归来解决,该问题的简单子问题是 知道左右孩子的值&#xff0c;再根据| &返回true/false。左子树右子树的值交给dfs解决。 终止条件就是到达叶子节点&#xff0c;即没有左右孩子&#xff0c;因为是完全二叉树 所以只需要判断一个…

Jupyter占用内存高问题排查解决

前言 前段时间我们上线了实例内存预警功能&#xff0c;方便大家更好地管理服务器内存资源。那么&#xff0c;也有同学会问&#xff0c;如果收到系统通知&#xff0c;我该怎么做呢&#xff1f;系统提示交换内存占用过高&#xff0c;但是又不知道是哪些程序占用的&#xff0c;怎么…