| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> Pytest学习笔记 -> 正文阅读 |
|
[开发测试]Pytest学习笔记 |
API文档地址:API Reference — pytest documentation 命名规则
若不按照命名规则,使用pytest一次性运行多个用例时,不按照命名规则的文件/case将被跳过 运行顺序与运行命令
有case失败时,exit code为1,当使用脚本运行完成后,命令行中执行echo $?可以查看对应exit code的执行情况。 Exit code 0 All tests were collected and passed successfully Exit code 1 Tests were collected and run but some of the tests failed Exit code 2 Test execution was interrupted by the user(执行时使用Crtl+C中断执行) Exit code 3 Internal error happened while executing tests(脚本中有内部错误) Exit code 4 pytest command line usage error(执行的命令行参数错误) Exit code 5 No tests were collected(没有test被执行)
断言与异常
fixture
import pytest class Fruit: def __init__(self, name): self.name = name self.cubed = False def cube(self): self.cubed = True class FruitSalad: def __init__(self, *fruit_bowl): self.fruit = fruit_bowl self._cube_fruit() def _cube_fruit(self): for fruit in self.fruit: fruit.cube() # Arrange @pytest.fixture def fruit_bowl(): return [Fruit("apple"), Fruit("banana")] def test_fruit_salad(fruit_bowl): # Act fruit_salad = FruitSalad(*fruit_bowl) # Assert assert all(fruit.cubed for fruit in fruit_salad.fruit) fruit_bowl()就是一个fixture,test_fruit_salad()方法中的参数有fruit_bowl(),他会先实例化fruit_bowl(),获取到fixture返回的值后,再执行test_fruit_salad()下面的语句。上述fixtrue使用替换成手动调用如下: def fruit_bowl(): return [Fruit("apple"), Fruit("banana")] def test_fruit_salad(fruit_bowl): # Act fruit_salad = FruitSalad(*fruit_bowl) # Assert assert all(fruit.cubed for fruit in fruit_salad.fruit) # Arrange bowl = fruit_bowl() #实例化 test_fruit_salad(fruit_bowl=bowl) #将实例化后的方法当参数传进去
@pytest.fixture(autouse=True) def append_first(order, first_entry): return order.append(first_entry)
MonkeyPatching
monkeypatch.setattr(obj, name, value, raising=True) //设置属性 monkeypatch.delattr(obj, name, raising=True) //删除属性 monkeypatch.setitem(mapping, name, value) //设置字典 monkeypatch.delitem(obj, name, raising=True) //删除字典 monkeypatch.setenv(name, value, prepend=False) //设置环境变量 monkeypatch.delenv(name, raising=True) //删除环境变量 monkeypatch.syspath_prepend(path) //修改sys.path monkeypatch.chdir(path) //更改当前工作路径 参数化 pytest有三种参数化方式: 1.@pytest.fixture,使用fixture的返回值来传参 2.使用@pytest.mark.parametrize 允许在测试函数或类中定义多组参数,在用例中实现参数化 3.使用钩子函数:pytest_generate_tests 允许定义自定义参数化方案或扩展:详细说明文档:pytest文档69-Hook函数之参数化生成测试用例pytest_generate_tests - 上海-悠悠 - 博客园 (cnblogs.com) @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)]) 1.表示传入test_input和expected两个参数,值用元组表示,一个元组代表一组值。有三组值,表示该方法会执行三次,每次用不同的值。 2.在@pytest.mark.parametrize中定义的参数,在方法中要传入该形参。 3.@pytest.mark.parametrize中可声明scope作用域,默认为function,表示加载完所有参数后在一个方法上执行。scope还可以取值:class,module,表示每一个参数在执行完当前类或者模块后再替换为下一个参数。 @pytest.mark.parametrize("x", [0, 1]) @pytest.mark.parametrize("y", [2, 3]) 两个作用在同一个方法上,表示使用笛卡尔积的方式取参,即x=0/y=2,?x=1/y=2,?x=0/y=3, and?x=1/y=3 这几组值。 SKIP
XFail pytest可以使一些测试方法在预期中失败
Skip/xfail with parametrize skip和xfail也可以集成在参数中: pytest.param()也可用于传参 import pytest @pytest.mark.parametrize( ("n", "expected"), [ (1, 2), pytest.param(1, 0, marks=pytest.mark.xfail), pytest.param(1, 3, marks=pytest.mark.xfail(reason="some bug")), (2, 3), (3, 4), (4, 5), pytest.param( 10, 11, marks=pytest.mark.skipif(sys.version_info >= (3, 0), reason="py2k") ), ], ) def test_increment(n, expected): assert n + 1 == expected pytest-dependency
doctest-文档测试 doctest是Python中自带的一个模块玩,为单元测试的一种,doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果。在pytest中也可以运行doctest,pytest中文件格式为test*.txt的文件将会被默认为doctest运行
# content of test_example.txt hello this is a doctest //不会执行 >>> x = 3 //执行的代码 >>> x //执行的代码 3 //期望的结果 2.运行命令:①可直接pytest运行.txt文件 ②pytest --doctest-modules 文件名运行指定文件 Unittest unittest是Python自带的另一种测试框架,在unittest.TestCase中可以使用pytest的某些属性:
还有三种属性在unittest.TestCase可能可以运行成功,可能无法运行成功:
Nose nose也是Python的一种测试框架,使用前需要install。和pytest一样都适用于单元测试,但是分别使用Pytest和nose发现:pytest遇到错误会打印出详细的错误信息,而nose不会,只是抛出错误名称 在nose框架中也可以使用Pytest的某些属性,详细看官方文档。 石墨文档链接:石墨文档 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/18 5:26:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |