让小脚本成为自己高效测试的工具

news2024/12/25 14:20:11

测试中会遇到的工具

软件测试如果仅仅靠手工去执行会发现在很多地方力不从心,虽然市面上已经有大牛开源了一些测试工具可以供我们使用但是在一些公司特有的业务方面则需要我们借助开源或重新做一个自己的测试工具。

测试常用的开源工具
  • 死链接检测工具 Xenu home.snafu.de/tilman/xenu… xenu曾被一些个人站长来检测自己网站 的死链接 在测试中也被用到
  • Soupai SoloPi github.com/alipay/Solo… 阿里开源的一个个无线化、非侵入式的 Android 自动化工具,具备录制回放、性能测试等功能
  • AppCrawler github.com/seveniruby/… 思寒大佬开源的一个monkey 工具,可以用来对APP做压力测试
  • httprunner github.com/httprunner/… debugtalk开源的一个接口测试框架,可以用来作为公司内部自动化测试的底层
  • STF github.com/openstf/stf 可以用用来做多设备测试(类似于云服务商提供的云测)
  • ....

Python

Python简单易上手的特点成为了绝大多数的测试人员的首选语言,自然社区中开源工具绝大多数是以Python的 虽然测试开发在软件测试行业被广泛应用,但其在企业中的投资回报率( ROI)
并不是非常理想,在中小企业中尤为突出。究其原因,有自动化脚本维护困难、投入大、
自动化用例不直观、自动化框架不适用、不稳定误报率大、前端 UI 变动较大且频繁等。因
此,很多中小企业的自动化尚处于演示版本摸索的状态。
我的观点是:先写一些工具去帮助测试人员解决工作中的重复且低价值的劳动,能用开源解决的尽量使用开源技术解决,等单个工具难以提升测试效率时在去考虑做一综合性的平台。
其实所谓的测试平台就是一个工具箱里面放着测试中会用的工具。

数据类型

字符串 json 列表与元组 服务端的IP端口号 不希望通过接口可以修改---使用元组 列表可以修改---可以动态修改 字典类型 定义 {'键':值} 集合 {1,2,3} 用途

  • 去重
  • 关系测试:交集 并集
 
  1. # 去重

  2. list1 = [1,2,3,3]

  3. print(set(list1))

  4. # 交集 并集

  5. set1 ={1,2,3,4}

  6. set2 = {4,5,6,7}

  7. # 交集

  8. print(set1 & set2)

  9. # 并集

  10. 复制代码

Socket编程技术

Socket 练习

一对一聊天

 
  1. ip_port = ('127.0.0.1',9999)

  2. import socket

  3. # 创建socket 对象

  4. sk = socket.socket()

  5. # 绑定ip port

  6. sk.bind(ip_port)

  7. # 开启监听

  8. sk.listen()

  9. print('------服务已经启动-------')

  10. # 阻塞 等待连接

  11. conn,addr = sk.qccept()

  12. print('客户端地址:',addr)

  13. # 接收数据---客户端数据

  14. client——data conn.recv(1024).decode('utf-8')

  15. print('接收的客户端说:',client_data)

  16. # 发送数据

  17. send_data = input('请输入')

  18. conn.sendall(send_data.enode('tuf-8'))

  19. # 关闭socket

  20. conn.close()

  21. 复制代码

 
  1. import socket

  2. # 创建socket 对象

  3. sk = socket.socket()

  4. # 连接服务器

  5. sk.connect(('127.0.0.1',9999))

  6. #3- 发送数据

  7. send_data = input('请输入:')

  8. sk.sendall(send_data.encode('utf-8'))# 要求是byte

  9. #4- 接收数据---服务端数据

  10. server_data = sk.recv(1024).decode('utf-8')

  11. print('接收的服务端 ',server_data)

  12. # 关闭socket

  13. conn.close()

  14. 复制代码

一对多聊天

 
  1. import sockketserver

  2. # 需要继承一个类

  3. class sqServer(socketserver.BaseRequestHandler):

  4. def handle(self):

  5. print('----聊天服务器上线了----')

  6. #逻辑

  7. while True:

  8. #接收数据

  9. client_data = self.request.recv(1024)

  10. print(client_data.decode('utf-8'))

  11. #if xxx: break

  12. #发数据

  13. send_data = input('请输入>>> ')

  14. self.request.sendall(send_data.encode('utf-8'))

  15. self.request.close()

  16. #2- 创建服务

  17. server = socketserver.ThreadingTCPServer(('127.0.0.1',8888),sqServer)

  18. #3- 一直在线

  19. server.serve_forever()

  20. 复制代码

 
  1. import socket

  2. #1- 创建socket对象

  3. sk = socket.socket()

  4. #2- 连接服务器

  5. sk.connect(('127.0.0.1',8888))

  6. #3- 发送数据

  7. while True:

  8. send_data = '\na: '+input('请输入>>> ')

  9. sk.sendall(send_data.encode('utf-8'))# 要求是byte

  10. #4- 接收数据---服务端数据

  11. server_data = sk.recv(1024).decode('utf-8')

  12. print('接收的客户端数据>>> ',server_data)

  13. #7- 关闭socket

  14. sk.close()

  15. 复制代码

 
  1. import socket

  2. #1- 创建socket对象

  3. sk = socket.socket()

  4. #2- 连接服务器

  5. sk.connect(('127.0.0.1',8888))

  6. #3- 发送数据

  7. while True:

  8. send_data = '\nb: '+input('请输入>>> ')

  9. sk.sendall(send_data.encode('utf-8'))# 要求是byte

  10. #4- 接收数据---服务端数据

  11. server_data = sk.recv(1024).decode('utf-8')

  12. print('接收的客户端数据>>> ',server_data)

  13. #7- 关闭socket

  14. sk.close()

  15. 复制代码

移动/UI自动化测试平台

平台需要做什么

基本管理:项目管理、人员管理、测试环境管理 测试管理:用例管理、测试执行管理,测试报告管理 测试能力整合

  • 自动化测试、自动遍历测试:功能测试回归与探索
  • 用户体验测试:性能、健壮性、弱网、耗电量、安全等
  • 兼容性测试:多样化设备的用户端验收测试 数据分析: 测试数据存储、测试数据分析
自建需要的技术
  • 前台: Vue + Bootstrap
  • 后台:Django
  • 测试执行: Jenkins
  • 测试数据存储: MySQL, ELS, RethinkDB
  • 数据分析:Kiababa, ECharts D3.js 可以复用的开源技术
  • 前后台测试用例管理: Pytest, Git
  • 测试设备管理: STF Sonic

接口测试平台

系统架构:前后端分离。 前端采用 HTML、CSS、JS 、VUE 技术开发设计,Nginx 作为前端 web 服务器。 后端采用 Django 技术开发设计,uwsgi 服务承载后台服务。 运维采用 docker 容器化配合 Jenkins pipelnine 完成持续部署 岗位职责-开发 负责测试平台整体业务与数据库结构设计 负责测试平台所有模块的后端 API 设计与开发工作 与前端开发配合,完成页面与后端接口的联调 负责项目的持续集成与持续部署 心得总结 通过这个项目对 Django 的 web 开发技术掌握更上一层楼,深刻了解了 web 前后端分离的机制与开发技巧。其 中对视图开发这块采用了模板与反射等技术实现了通用视图,减少了代码的开发量。 在接口测试管理这块,完成了用例与接口 API 的关联,测试计划与报告的关联,整体业务流程 OK,但是细节反 面仍然需要优化,后续会迭代前置与后置功能,参数化功能。 由于接口 restful 风格,可以换成 django-restfulframework 来开发效率会更高

运维

所谓运维,就是将系统部署到服务器上,并且连接公网,在这个过程种要求系统能够有效的接收外界请 求并能够正常工作。这个过程通常没有唯一的方案与工具,每个技术栈都八仙过海、各显神通。运维如果要做到自动化其难难度不亚于测试开发

Django运维部署框架

整体部署架构 linux+mysql+nginx+uwsgl

[toc]

单元测试概述

什么是单元测试

单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小很明确的功能是否正确。通常而言,一个单元测试是判断某个特定条件(或者场景)下某个特定函数的行为。

单元测试什么进行?

单元测试越早对后期的集成测试越有好处

单元测试由谁负责?

开发者自己负责

单元测试需要注意

单元测试的时候一个大前提就是需要清楚的知道,自己要测试的程序块所预期的输入输出,然后根据这个预期和程序逻辑来书写 case。这里的预期结果一定要针对需求/设计的逻辑去写,而不是针对程序实现去写,否则单元测试就失去了意义,照着错误的实现设计出的 case 也可能是错的。单元覆盖率 代码覆盖率也被用于自动化测试和手工测试来度量测试是否全面的指标之一,应用覆盖率的思想增强测试用例的设计

单元测试覆盖类型

待测试的代码片段

 
  1. def demo_method(a,b,x):

  2. if (a>1 and b==0):

  3. x=x/a

  4. if (a==2 or x>1

  5. x= x+1

  6. return x

  7. 复制代码

语句覆盖

  • 定义 通过设计一定量的测试用例,保证被测试的方法每一行都会执行一遍。运行测试用例的时候被击中的代码行即称为被覆盖的语句
  • 测试用例 需要一条 case,即可实现行覆盖:a=10,b=0,x=3 漏洞 and -> or:第一个判断 if 内的 and 改为 or 后此测试用例可以通过 行覆盖是一个最基础的覆盖方式,但是也是最薄弱的,入过完全依赖行覆盖,就会出现严重的问题 判断覆盖
  • 定义:运行测试用例过程中被击中的判定语句 测试用例

漏洞: 大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽视每个取值条件的结果,必然会遗漏部分测试路径 a ==2 or x>1 ---> a==2 or x<1 条件覆盖

  • 定义: 条件覆盖和判定覆盖类似,不过判定覆盖关注整个判定语句而条件覆盖关注某个判定条件

测试用例: if (a >1 and b ==0)

缺陷:测试用例指数级增加(2**conditions) 路径覆盖

  • 定义: 覆盖所有可能执行的路径 测试路径

    测试用例 可以利用桩代码的技术帮助实现路径覆盖

python 单元测试框架

unittest:Python 内置的标准库。它的 API 跟 Java 的 JUnit,.net 的 NUnit,C++的 CppUnit pytest:丰富,灵活的测试框架,语法简单,可以结合 allure 生成一个酷炫的测试报告 Nose: unittest 的扩展,使得 python 的测试更加简单 Mock:unittest.mock 是用来测试 python 的库,这个是一个标准库(出现在 python 3.3 以后)

unittest

python 自带的单元测试框架,常用在单元测试 在自动化测试中提供用例组织与执行 提供丰富的断言---验证函数等功能 加上 HTMLTestRunner 可以生成 HTML 的报告

unittest 编写规范

  • Unittest 提供了 test cases,test suite, test fixtures, test runner 相关的组件
  • 测试模块首先 import unittest
  • 测试类必须集成 unittest.TestCase
  • 测试方法必须以“.test_”开头
  • 模块名字,类名没有特殊要求 unittest 测试框架结构
  • SetUp 用来准备测试环境,tearDown 用来清理环境
  • 如果想要在所有 case 执行之前准备一次环境,并在所有 case 执行结束后再清理环境,我们可以使用 setUpClass(),与 tearDownClass()
  • 如果有些方法不在本次执行使用 @unittest.skip
  • 测试方法的命名:以 test 开头

各种执行行-单一用例, 全部

 
  1. import unittest

  2. class TestClass(unittest.TestCase):

  3. @classmethod

  4. def setUpClass(cls):

  5. print("这个测试整个类前要执行的方法")

  6. def setUp(self):

  7. print("这是每一个类创建的方法")

  8. def tearDown(cls):

  9. print("这是每一个方法后面运行的方法")

  10. def test_first(self):

  11. print("这是测试方法1")

  12. self.assertEqual(1,1)

  13. @unittest.skip("这次不想执行这个测试")

  14. def test_second(self):

  15. print("这是测试方法2")

  16. self.assertEqual(1,'1',"1 is not equal '1'")

  17. @classmethod

  18. def tearDownClass(cls):

  19. print("这是测试整个类后要执行的方法")

  20. if __name__ == '__main__':

  21. unittest.main()

  22. 复制代码

assert 断言 python3---assert 官方文档:docs.python.org/3/library/u… unittest 执行测试用例 多个测试用例的集合就是测试套件,通过测试套件来管理多个测试用例

执行方法 1 unittest.main()

执行方法 2: 加入容器中执行

 
  1. suite.addTest(TestMethod("test_01"))

  2. suite.addTest(TestMethod(("test_02"))

  3. unittest.TextRunner().run(suite)

  4. 复制代码

测试方法三:此用法可以同时测试多个类

 
  1. suite1 = unittest.TestLoader().loadTestsFromTestsFromTestCase(TestCase1)

  2. suite2 = unittest.TestLoader().loadTestsFromTestsFromTestCase(TestCase2)

  3. suite = unitest.TestSuite([suite1,suite2])

  4. unitest.TextTestRunner(verbosity=2).run(suite)

  5. 复制代码

执行方法四:匹配某个目录下所有以 test 开头的 py 文件,执行这些文件下所有测试用例

 
  1. test_dir ="./test_case"

  2. discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py"

  3. discover 可以一次调用多个脚本

  4. test_dir 被测试脚本的路径

  5. pattern 脚本名称匹配规则

  6. 复制代码

测试用例执行过程

  1. 写好 TestCase
  2. TestLoader 加载 TestCase 到 TestSuite
  3. TextRunner 来运行 TestSuite 运行结果保存在 TextResult 中 整个过程集成在 unittest.main 模块中 TestCase 可以是多个,TestSuite 也可以是多个 生成测试报告 HTMLTestRunner_py2:tungwaiyip.info/software/HT… HTMLTestRunner_py3:github.com/huilansame/…

pytest 测试框架

pytest 框架介绍 pytest 是一个非常成熟的全功能的 python 测试框架 简单灵活,容易上手 支持参数化 测试用例的 skip 和 xfail,自动失败重试 能够支持简单的单元测试和复杂的功能测试,还可以用来做 selenium/appium 等自动化测试,接口自动化测试(pytest +requests) pytest 具有很多第三方插件,并且可以自定义扩展,比较好的如 pytest-allure 可以很好的和 jenkins 集成 官方文档 文档:Full pytest documentation — pytest documentation

第三方库:Search results · PyPI

pytest 简单练习

 
  1. # 文件名 test_simple.py

  2. def func(x):

  3. return x+1

  4. def test_answer():

  5. assert func(3)==5

  6. 复制代码

pytest .\test_simple.py pytest .\test_simple.py pip install -U pytest U 表示升级 pip install pytest pytest-sugar pip install pytest-rerunfailures pip install pytest-xdist pip install pytest-assume pip install pytest-html pip list 查看 pytest -h 帮助

测试用例的识别与运行

测试文件

  • test_*.py
  • *_test.py

用例识别

  • Test类包含所有 test_的方法(测试类不能带有__init__方法)
  • 不在 class 中的所有的 test_* 方法 pytest 也可以执行 unittest 框架写的用例和方法 终端执行
 
  1. pytest/py.test

  2. pytest -v (最高级别信息--verbose)打印详细运行日志信息

  3. pytest -v -s 文件名(s 是带控制台输出结果,也是详细输出)

  4. pytest 文件名.py 执行单独一个 pytest 模块

  5. pytest 文件名.py::类名 运行某个模块里面某个类

  6. pytest 文件名.py:: 类名::方法名 运行某个模块里面的某个类里面的方法

  7. pytest -v -k "类名 and or 方法名" 跳过某个用例

  8. pytest -m [标记名] @ Mark.[标记名] 将运行有这个标记的测试用例

  9. pytest -x 文件名 一旦运行报错就停止运行

  10. pytest --maxfail==[num] 当运行错误达到 num 的时候就停止运行

  11. 复制代码

Pytest 执行--失败重新运行

场景: 测试失败后要重新运行 n 次,要在重新运行之间添加延迟时间,间隔 n 秒再运行 pip install pytest-rerunfailures

pytest -v --reruns 3 -s test_class.py

pytest -v - -reruns 5 --returns-delay 1 多条断言有失败也都运行 场景:一个方法中写多条断言,通常第一条过不去,下面就不执行了。我们想报错也都执行一下。

pip install pytest-assume

pytest.assume(1==4)

pytest.assume(2==4)

测试用例的识别与运行

pycharm 配置与执行 pytest 测试框架

pytest 框架结构 import pytest 类似的 setup, teardown 同样更灵活

  • 模块级(setup_module/ teardown_module)模块始末,全局的(优先级最高)

  • 函数级(setup_function/teardown_function) 只对函数用例生效(不在类中)

  • 类级 (setup_class/teardown_class)只在类中前后运行一次 (在类中)

  • 方法级 (setup_method/teardown_method) 开始于方法始末(在类中)

  • 类里面的(Setup/teardown)运行在调用方法的前后

pytest-fixture 的用法 场景

  • 用例 1 需要先登录,用例 2 不需要登录,用例 3 需要登录

在方法前面 @pytest.fixture() 例子 1:前端自动化中应用 场景:测试用例执行时,有的用例需要登录才能执行,有些用例不需要登录。setup 和 teardown 无法满足,fixture 可以。,默认 scope function

  1. 导入 pytest
  2. 在登录的函数上加 @pytest.fixture()
  3. 在要使用的测试方法中传入(登录函数名称),就先登陆
  4. 不传入的就不登录直接执行测试方法

  5. 在测试团队合作中,可以在 conftest.py 中写公共的方法(pytest) 例子 2:前端自动化中应用---conftest

场景:与其他测试工程师合作一起开发时,公共模块要在不同文件中,要在大家都能访问到的地方

  1. conftest.py 这个文件进行数据共享,并且他可以放在不同位置起着不同的范围共享作用
  2. 系统执行到参数 Login 时先从文本文件中查找是否有这个名字的变量,之后在 conftest.py 中找是否有

步骤:

将登录模块带 @pytest.fixture 写在 conftest.py

conftest.py 配置需注意:

conftest 文件名是不能换的

conftest.py 与运行的用例要在同一个 package 下,并且有__init__.py

不需要 import 导入 conftest.py ,pytest 用例会自动查找

全局的配置和前期工作都可以写在这里,放到某个包下,就是这个包数据共享的地方

例子 3: 前端自动化中应用-yield

场景:

你已经可以将测试方法前要执行的或的依赖解决了,测试方法后销毁清除数据要如何进行呢?

解决

通过在同一模块中加入 yield 关键字,yield 是调用第一次返回结果,第二次执行它下面的语句返回

步骤

在 @pytest.fixture(scope= module)

在登录的方法中加 yield ,之后加销毁清除的步骤,(这种方法没有返回值,如果希望返回使用 addfinalizer)

fixture 的自动应用

场景

不想源测试方法有任何改动,或全部都自动实现自动应用,每特例,也都不需要返回值时可以选择自动应用

解决

使用 fixture 中的 autouse = True 实现

步骤

在方法上加 @pytest.fixture(autouse = True)

在测试方法上加 @pytest.mark.usefixtures("start")

从结果中可以看到每次测试方法的执行软件都执行了 open 函数

fixture 带参数传递

场景

测试离不开数据,为了数据灵活,一般数据购书通过参数的

解决:fixture 通过固定参数 request 传递

步骤

在 fixture 中增加 @pytest.fixture(params=[1,2,3,'linda']在参数写 request

import pytest

@pytest.mark.parametrize("test_input,expected",[{"3+5",8},("2+5",7),("7+5",30)]) def test_eval(test_input,expected): assert eval(test_input) == expected

import pytest

test_user_data =['Toma','Jerry'] @pytest.fixture(scope="module") def login_r(request): # 这是接收并传入参数 user = request.param print( f"\n 打开首页准备登录,登录用户:{user}") return user indirect = true 可以把传过来的参数当函数来执行 @pytest.mark.parametrize("login_r",test_user_data,indirect=True) def test_login(login_r): a = login_r print(f"测试用例中login的返回值:{a}") assert a!= ""

skip 跳过

xfail

mark 中的 skip 与 xfail

skip 使用场景

调试是不想运行这个用例

标记无法在某些平台上运行的测试功能

在某些版本中执行,其他版本跳过

当前的外部资源不可用时跳过(如果测试数据是从数据库中取得的,连接数据库的功能如果返回结果未成功就跳过,因此执行也都报错)

解决

@pytest.mark.skip 跳过这个测试用例,可以加上条件 skipif, 在某些条件下才希望通过,否则就跳过这个测试

Xfail 场景

功能测试尚实施或尚未修复的错误,当前测试通过时,尽管预计会失败(标记为 pytest.xfail, 它是一个 xpass ,将在测试摘要中报告

你希望测试由于某种情况而应该失败

解决

@pytest.mark.xfail

使用自定义标记 mark 只执行某部分用例

场景

只执行符合要求的某一部分用例,可以把一个 web 项目划分为多个模块,然后指定模块名称执行

app 自动化是,如果想 Android 和 IOS 共用一套代码时,可以使用标记功能标记那些是 Android 的,那些是 iOS 的运行时指定 Mark 名称即可

解决

在测试用例方法上加上 @pytest.mark.webtest

执行

-s 参数:输出所有测试用的 print 信息

-m :执行自定义标记的相关用例 pytest -s test_mark_zi_09.py

pytest -s test-mark_zi_09.py -m=webtest

pytest -s test_mark_zi_09.py -m apptest

pytest -s test_mark_zi_09.py -m "not ios"

多线程并行执行与分布式执行

场景

测试 1000 条,一个用例执行 1 分钟,一个测试员执行需要 1000 分钟,通常我们会用人力成本换取时间成本,加几个人一起执行,时间就会缩短。如果 10 个人一起执行只需要 100 分钟,这就是一种并行测试,分布式场景

解决

pytest 分布式插件:pytest-xdist,多个 CPU 或主机执行 前提:用例之间是独立的,没有先后顺序,随机都能执行,可重复运行并不影响其他用例

安装:

pip3 install pytest-xdist

多个 CPU 并行执行用例,直接加-n 3 是并行数量 pytest -n 3

在多个终端下一起执行

pytest-html 生成报告

安装

pip imstall pytest-html

pypi.org/project/pyt…

生成 html 报告

pytest -v -d --html - - self-contained-html

参数化用例 pytest 数据参数化

@python.mark.parametrize (argnames, argvalue)

argnames:要参数化的变量,string(逗号分割) list tuple

使用 string

@pytest.mark.parametrize("a,b",[(10,20),(10,30)] def test_param(self,a,b): print(a+b) 使用 list

@pytest.mark.parametrize(["a","b"],[10,20],[10,30]) def test_param(self,a,b): print(a+b) 使用 tuple

@pytest.mark.parametrize(("a","b"),[10,20],[10,30]) def test_param(self,a,b): print(a+b)

class Testdata: # @pytest.mark.parametrize("a,b",[(10,20),(10,5),(3,9)]) # @pytest.mark.parametrize(("a","b"),[(10,20),(10,5),(3,9)]) @pytest.mark.parametrize(["a","b"],[(10,20),(10,5),(3,9)]) # ["a","b"] 可以进行修改 # ("a","b") 可以进行修改

 
  1. def test_data(self,a,b):

  2. # a=10

  3. # b=20

  4. print(a+b)

  5. 复制代码

argvalues: 参数化的值,list, list[tuple]

yaml 的基本使用

yaml 实现 list

list

  • 10

  • 20

  • 30

yaml 实现字典

dict

by:id

locator:name

action:click

yaml 进行嵌套

  • by:id

-locator:name

  • action:click

yaml 进行更复杂的嵌套

companies:

id:1

name: company1

price:200w

id:2

name:company2

price:500w

companies:[{id:1,name:company,price:200w},{id:2,name:company2,price:500w}]

加载 yaml 文件

yaml.safe_load(open("./data.yaml"))

class Testdata_yaml: @pytest.mark.parametrize(("a","b"),yaml.safe_load(open("./data.yaml"))) def test_data_yml(self,a,b): print(a+b) pip install PyYaml

data.yml

运行结果

数据驱动 简介

数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变(参数化的应用)

数据量大的测试用例可以使用一种结构 haul 的文件(yml, JSON)来对数据进行存储,然后再测试用例中读取这些数据

简单练习

import pytest import yaml

class TestDemo: @pytest.mark.parametrize("env",yaml.safe_load(open("./env.yml"))) def test_demo(self,env): if "test" in env: print("这是测试环境") print("测试环境的IP是:",env["test"]) elif "dev" in env: print("这是开发环境") print("开发环境的IP是:",env["dev"]) def test_yaml(self): print(yaml.safe_load(open("./env.yml")))

应用场景

App, Web,接口自动化测试

测试步骤的数据驱动

测试数据的数据驱动

配置的数据驱动

测试报告美化 Allure 介绍

Allure 是一个轻量级,灵活的,支持多语言的测试报告工具

多平台,奢华的 report 框架

可以为 dev/qa 提供详尽的测试报告,测试步骤 log

也可以为管理层提供 high level 统计报告

Java 语言开发的,支持跑 pytest,javascript,PHP,ruby

可以继承到 jenkins

allure 安装

Windows/mac 通用安装方法

Releases · allure-framework/allure2 · GitHub

解压---> 进入 bin 目录---> 运行 allure.bat

把 bin 目录 加入 PATH 环境变量

Mac 可以使用 brew 安装

brew install allure

官网 :Allure Framework (qameta.io)

使用 allure2 生成精美报告

安装 allure-pytest

pip install allure-pytest

运行:

在测试执行期间收集结果

pytest[测试文件] -s -q --alluredir= ./alluredir =./result/ (--alluredir 这个选项用于指定存储测试结果的路径)

查看测试报告

测试完成后查看实际报告,在线看报告,会直接打开默认浏览器展示当前报告

allure serve ./result/

从结果生成报告,这是一个启动 Tomcat 的的服务,需要两个步骤:生成报告,打开报告

生成报告:allure generate ./result/5 -o ./report/ --clean (注意:覆盖路径加 --clean)

打开报告: allure open -h 127.0.0.1 -p 8883 ./report/

Allure 常用特性

场景

希望在报告中看到的功能,子功能或场景,测试步骤,包括测试附加信息

解决:

@Feature, @story, @step, @attach

步骤:

import allure

功能上加 @allure.feature("功能名称")

子功能上加 @allure.story("子功能名称")

步骤上加 @allure.step("步骤细节")

@allure.attach("具体文本信息"),需要附加的信息,可以是数据,文本,图片,视频网页

如果只是测试登录功能运行的时候可以添加限制过滤:

pytest 文件名 --allure-features "购物车功能" --allure-storws "加入购物车"

allure 特性-feature/story

注解 @allure.feature 与 @allure.store 的关系

feature 相当于一个功能,一个大的模块,将 case 分类到某个 feature 中,报告中 behaviore 中显示,相当于 testsuite

story 相当于对应这个功能或者模块下的不同场景,分支功能,属于 feature 之下的结构,报告在 features 中显示,相当于 testcase

feature 于 story 类似与父子关系

allure 特性-step

测试过程中每个步骤,一般都放在具体逻辑方法中

可以放在关键步骤中,在报告中显示

在 app,web 自动化测试当中,建议每切换到一个新的页面当做一个 step

用法:

@allure.step() 只能以装饰器的形式放在类或者方法上面

with allure.step(): 可以放在测试用例方法里面,但测试步骤的代码需要该语句包含

allure 特性-issue, testcase

关联测试用例(可以直接给测试用例地址链接)

关联 bug

执行的时候需要加个参数

--allure-link-pattern==issue:www.mytesttracker.com/issue{}

代码

@allure.issue('140','Pytest-flaky test retires shows like steps') def test_with_issue_link(): pass TEST_CASE_LINK ='github.com/qameta/allu…' @allure.testcase(TEST_CASE_LINK,'Test case title') def test_with_testcase_link(): pass 按重要级别进行一定范围测试

场景

通常测试有 p0、冒烟测试、验证验证上线测试。按重要级别来分别执行的,比如上线要把主流程和重要模块都跑一遍

解决

通过 pytest.mark 标记

通过 allure.feature, allure.story

也可以通过 allure.severity 来附加标记

级别:Trivial : 不重要,Minor 不太重要,Normal :正常问题,Critical:严重,Blocker:阻塞

Blocker 级别:中断缺陷(客户端程序无响应,无法执行下一步操作)

Critical 级别:临界缺陷(功能点缺失)

Minor 级别:次要缺陷(界面错误与 UI 需求不符)

 
  1. -Trival 级别:轻微缺陷(必输项无提示,或者提示不规范)

  2. 复制代码

步骤

在方法,函数和类上面加

@allure.servity(allure.severity_level.TRIVIAL)

执行时

pytest -s -v 文件名 --allure-severities normal.critycal

前端自动化测试---截图

场景

前端自动化测试经常需要附加图片或 html,在适当的地方,适当的时机截图

解决

allure.attach(body(内容),name, attachment_type,extension);

allure.attach(’首页‘,’这是错误页的结果信息‘ ,allure.attachment_type.HTML)

在测试报告里附加图片:

allure.attach.file(source,name,attachment_type,extension):

allure.attach.file("./result/b.png",attachment_type=allure.attachment_type.PNG)

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

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

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

相关文章

如何使用便签高效管理自己的工作和时间?

在快节奏的现代生活中&#xff0c;我们每天都要面对众多工作任务&#xff0c;而时间却是有限的。如何在有限的时间内高效地完成工作&#xff0c;成为了每个职场人士必须面对的挑战。为了更好地管理时间&#xff0c;提高工作效率&#xff0c;我们往往需要借助一些工具来帮助我们…

Linux上Java项目环境安装

java环境 一.免费的管理Linux软件 家庭/学校免费 - NetSarang Website (xshell.com) 二.安装jdk // 检查以前是否安装过jdk java -version // 我们还可以通过以下指令来看我们安装了多少openJDK apt list --installed | grep openjdk// 如果你想卸载某个apt安装的java版本&am…

CMOS Sensor调试笔记

最近在调CMOS Sensor&#xff1b;基于无ISP的芯片。 第一步&#xff0c;找模组厂要到对应Sensor对应分辨率&#xff0c;YUV信息的驱动。 第二步&#xff0c;确认信号的极性&#xff0c;VSYNC&#xff0c;SYNC, PCLK。 第三步&#xff0c;开始测试。 问题解决&#xff1a; 1&am…

覆盖生活中各方面的5款软件,非常好用

​ 在现代生活中&#xff0c;各类工具软件为我们提供了便捷的解决方案&#xff0c;从日程管理到系统优化&#xff0c;再到文件传输与多媒体编辑&#xff0c;各类软件的功能多样&#xff0c;极大地提升了我们的工作与生活效率。 1.日历清单——日历清单 ​ 日历清单是一款集日…

运营计划管理——电商运营(案例分享)

运营计划&#xff0c;作为运营管理的重要组成部分&#xff0c;通过科学规划与有效执行&#xff0c;对确保企业目标实现起着至关重要的作用。 运营计划是指通过制定、执行、监控和调整运营计划&#xff0c;以确保企业资源得到合理配置&#xff0c;业务活动有序进行&#xff0c;最…

学习threejs,添加户外光照光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

windows 桌面采集音频

头文件&#xff1a; #ifndef __CAPTURE_AUDIO__ #define __CAPTURE_AUDIO__#include <functional> #include <windows.h> #pragma comment(lib, "winmm.lib")class CaptureAudio { public:CaptureAudio();~CaptureAudio();public:bool Init(const std::…

云计算Openstack Glance

OpenStack Glance&#xff08;或称为Glance&#xff0c;但通常OpenStack官方文档中使用的是“Glance”作为项目代号&#xff09;是OpenStack的镜像服务组件&#xff0c;为创建虚拟机提供镜像服务。以下是对OpenStack Glance的详细解析&#xff1a; 一、基本功能 Glance主要提…

【HTML并不简单】笔记2-你不知道的a元素属性:target、download、ping、referrerpolicy和href

文章目录 target属性download属性ping属性referrerpolicyhref细节自动绝对地址锚点定位无障碍访问为何base元素无人问津实现链接元素a的嵌套 《HTML并不简单&#xff1a;Web前端开发精进秘籍》张鑫旭 笔记 target属性 有场景如下&#xff1a; 在线写作工具经常会有预览功能&a…

源2.0-M32大模型适配AutoGPTQ工具及量化推理教程

AutoGTPQ简介 AutoGPTQ‌是一个开源工具包&#xff0c;专注于简化大规模语言模型(LLMs)的量化过程。它基于高效的GPTQ算法开发&#xff0c;主要使用Python编程语言&#xff0c;并依托PyTorch框架来实现量化功能。AutoGPTQ的设计目标是为开发者和研究人员提供一个易于使用的API接…

【Golang】关于Go语言数学计算、随机数生成模块--math

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

多功能声学气膜馆:承载梦想与希望的舞台—轻空间

在9月29日上午&#xff0c;苏州大学应用技术学院的2024级新生开学典礼暨开学第一课在轻空间建造的多功能声学气膜馆内盛大举行。这一盛典不仅见证了2849名新生的入学&#xff0c;也展示了气膜馆的独特魅力与优越功能。 卓越的声学表现 声学气膜馆采用高性能材料&#xff0c;确保…

Linux-基础实操篇-组管理和权限管理(上)

Linux 组基本介绍 在 linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。 用户和组的基本概念&#xff1a; 用户名&#xff1a;用来识别用户的名称&#xff0c;可以是字母、数字组成的字符串&#xff0…

解决DHCP服务异常导致设备无法获取IP地址的方法

DHCP在网络环境中会自动为网络中的设备分配IP地址和其他关键网络参数&#xff0c;可以简化网络配置过程。但是&#xff0c;如果DHCP服务出现异常时&#xff0c;设备可能无法正常获取IP地址&#xff0c;会影响到网络通信。 本文讲述一些办法可以有效解决DHCP服务异常导致设备无法…

YAML管理接口框架配置的最佳实践!!

YAML 文件在接口框架中作为配置管理的语言&#xff0c;以其简洁、直观的语法&#xff0c;迅速成为开发者的宠儿。然而&#xff0c;如何高效地管理和组织接口框架的配置&#xff0c;往往是一个容易被忽视的难题。你是否曾因为冗长的配置文件而感到头疼&#xff1f;今天&#xff…

干冰清洗机的工作原理

干冰清洗机的工作原理主要基于干冰的物理特性&#xff0c;特别是其升华过程。以下是干冰清洗机工作原理的详细解释&#xff1a; 一、干冰的制备 制冰系统&#xff1a;干冰清洗机内部配备有制冰系统&#xff0c;该系统将液态二氧化碳&#xff08;CO₂&#xff09;快速冷却并压…

HTTP协议讲解,请求报文与响应报文都是什么?网络控制台查看HTTP请求

目录 一. HTTP解析 二. 请求报文 2.1 请求行 2.1.1 请求类型 2.1.2 请求URL路径 2.1.3 发送的HTTP请求的版本 2.2 请求头 2.2.1 Host&#xff1a;主要用来实现虚拟主机技术 2.2.2 Cookie&#xff1a;一种让浏览器帮忙携带信息的手段 2.2.3 Content—type&#xff1a;…

揭秘分布式定时任务在人工智能RPA机器人中的应用|实在RPA研究

一、引言 在人工智能技术不断突破的今天&#xff0c;RPA智能机器人已经渗透到各行各业&#xff0c;成为企 业提升效率、降低成本的重要工具。而在机器人高效运作的背后&#xff0c;分布式定时任务发挥着 不可替代的作用。本文将深入探讨分布式定时任务在人工智能机器人中的应用…

leetcode-链表篇3

leetcode-61 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#x…