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

测试中会遇到的工具

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

测试常用的开源工具
  • 死链接检测工具 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.xdnf.cn/news/1551379.html

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

相关文章

【羊毛资源】华为云开发者云主机免费申请使用指南

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

SpringAOP实现的两种方式-JDK动态代理和CGLIB动态代理

前言 想要了解SpringAOP的实现方式&#xff0c;需要先了解什么是AOP OOP和AOP的区别 OOP 面向对象&#xff0c;允许开发者定义纵向的关系&#xff0c;但并适用于定义横向的关系&#xff0c;导致了大量代码的重复&#xff0c;而不利于各个模块的重用。 AOP&#xff0c;一般称为…

解决Cloudflare 521错误的四种方法

在使用Cloudflare进行网站加速时&#xff0c;错误521是一个常见的问题&#xff0c;表示“Web服务器关闭”。当你访问某个使用Cloudflare的网站时&#xff0c;如果原始服务器拒绝了Cloudflare的连接请求&#xff0c;浏览器就会显示此错误信息。本文将详细介绍导致错误521的原因&…

如何将list嵌套的list的[]去掉

如果list里里面的元素是数字&#xff0c;‘1’也是可以的&#xff0c;那么我们可以使用np.ravel a [[1,2,3], [5, 2, 8], [7,8,9]]list(np.ravel(a)) #[1, 2, 3, 5, 2, 8, 7, 8, 9]对于不规则List c[[‘云阳站’], [‘双江’, ‘木古’], [‘滨双线’], [‘滨双线’, ‘云田线…

CRM在客户生命周期管理中的高效应用

企业要想在市场中持续增长并脱颖而出&#xff0c;就必须深刻理解并有效管理客户生命周期。客户生命周期&#xff0c;简而言之&#xff0c;是指从客户首次接触企业到最终与企业关系终止的全过程&#xff0c;它涵盖了多个关键阶段&#xff0c;每个阶段都蕴含着不同的机遇与挑战。…

无线领夹麦克风哪个牌子好?2024年口碑最好的领夹麦克风品牌推荐

举国同庆的国庆节快要到了&#xff0c;相信不少朋友都想趁此机会多拍摄一些Vlog来记录美好节日&#xff0c;想要音质效果好&#xff0c;领夹麦克风少不了&#xff01;但是无线领夹麦克风行业看似繁荣的背后&#xff0c;却隐藏着一些不为人知的黑幕。从夸大信号稳定性到忽视音质…

0代码、自动化,让AI视觉算法赋能千行百业(含源代码)

AI视频卫士通过自动化机器学习技术&#xff0c;降低AI开发和训练的门槛&#xff0c;让更多行业能够轻松接入AI&#xff0c;解决实际问题。 例如一个不懂AI的产品经理&#xff0c;但是他知道他想要能够检测到垃圾桶是否装满溢出&#xff0c;那么他只需要上传垃圾桶装垃圾溢的场景…

LangChain进阶技巧:提高聊天机器人性能的策略[第三课]

LangChain应运而生&#xff0c;为开发者们提供了一种高效、便捷的工具&#xff0c;助力他们构建出功能强大的大型语言模型应用。本文将带您走进LangChain的世界&#xff0c;揭秘其背后的技术原理&#xff0c;探讨如何利用这一利器来拓展语言模型的无限可能。通过丰富的实例分析…

“DNA亲和纯化测序:汇智生物的精准分析“

&#x1f331; 汇智生物 | 专注农业&植物基因组分析 &#x1f331; &#x1f393; 教授【优青】团队亲自指导&#xff01;提供专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效&#xff0c;为农植物科研保驾护航&#xff01; &#x1f52c; 专业实验外包服务&am…

正点原子阿波罗STM32F429IGT6移植zephyr rtos(二)---使用I2C驱动MPU6050

硬件平台&#xff1a;正点原子阿波罗STM32F429IGT6 zephyr版本&#xff1a;Zephyr version 3.7.99 开发环境&#xff1a;ubuntu 24.4 zephyr驱动开发与之前接触到的开发方式可能都不一样&#xff0c;更像是linux驱动开发&#xff0c;zephyr源码里边其实已经有写好的I2C和MPU60…

ST-GCN模型实现花样滑冰动作分类

加入深度实战社区:www.zzgcz.com&#xff0c;免费学习所有深度学习实战项目。 1. 项目简介 本项目实现了A042-ST-GCN模型&#xff0c;用于对花样滑冰动作进行分类。花样滑冰作为一项融合了舞蹈与竞技的运动&#xff0c;其复杂的动作结构和多变的运动轨迹使得动作识别成为一个具…

CRM如何实现对客户信息的全局管理?

在知识产权与科技服务领域中&#xff0c;企业如何精准把握客户需求&#xff0c;高效管理知识产权资产&#xff0c;成为了决定其竞争力的关键因素。传统的CRM虽在一定程度上提升了客户管理效率&#xff0c;但在面对知识产权这一复杂且多变的领域时&#xff0c;往往显得力不从心。…

Html jquery下拉select美化插件——selectFilter.js

1. Html jquery下拉select美化插件——selectFilter.js jQuery是一个广泛使用的JavaScript库&#xff0c;它简化了DOM操作、事件处理、动画以及Ajax交互&#xff0c;使得开发者能更高效地构建交互式网页。在本案例中&#xff0c;jquery.selectlist.js插件正是基于jQuery构建的&…

滑动窗口->dd爱框框

1.题目&#xff1a; 2.题解&#xff1a; 2.1为什么用滑动窗口优化&#xff1a; 因为元素都是大于0的 所以&#xff1a;当找到大于等于x的值时&#xff0c;right可以不用返回 两个指针都往后走&#xff1b;因此可以使用滑动窗口优化暴力解法 2.2&#xff1a;滑动窗口具体使用步…

python flask实现mock接口

在 Flask 中实现模拟&#xff08;mock&#xff09;接口通常是为了在没有实际后端服务的情况下进行前端开发、单元测试或集成测试。你可以创建一个简单的 Flask 应用来模拟特定的 API 行为&#xff0c;返回预设的数据。以下是如何使用 Flask 实现一个 mock 接口的示例&#xff1…

NAT模式 LVS负载均衡群集部署

目录 NAT模式 LVS负载均衡群集部署 1.关闭所有虚拟机的防火墙和核心防护 2.部署共享存储nfs&#xff08;ip:192.168.110.20&#xff09; 3.配置nginx节点服务器&#xff08;192.168.110.70&#xff0c;192.168.110.80&#xff09; 4.配置tomcat节点服务器&#xff08;192.…

c++第十二章续(队列结构类模拟)

队列类 设计类&#xff0c;需要开发公有接口和私有实现 Queue类接口 公有接口&#xff1a; 默认初始化&#xff0c;和可以用显式初始化覆盖默认值 Queue类的实现 如何表示队列数据&#xff1a; 一种方法是使用new动态分配一个数组&#xff0c;它包含所需的元素数。不过&…

知乎信息流广告营销获客投放策略!

知乎内容营销已成为品牌吸引目标客户、提升品牌知名度的重要手段&#xff0c;吸引了众多企业的关注。为了更好地利用知乎这一平台进行品牌推广&#xff0c;越来越多的企业开始关注知乎信息流广告的投放。云衔科技通过知乎信息流广告实现高效的营销获客&#xff0c;为企业提供知…

如何实现一个优秀的散列表!

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 前言 假设现在有一篇很长的…

锦囊妙计系列:没有项目支撑的情况下怎么从java到Python平稳过度并就业成功

从Java转向Python&#xff0c;并在没有项目支撑的情况下平稳过渡并实现就业&#xff0c;尽管有挑战&#xff0c;但完全可以通过系统学习、项目积累、技能展示和策略性求职来达成目标。以下是详细的步骤和策略&#xff0c;帮助你在不依赖现有项目的情况下实现从Java到Python的成…