pytest与unittest之间的故事

unittest
-- 写用例 - TestCase
-- 收集用例 -TestLoader.discover()
-- 生成报告 -HtmlTestRunner
-- 模板
pytest
-- 能够运行unittest用例
-- 灵活

nose
behave - 行为驱动

共同点:
1、测试框架 - 通过python代码来编写测试用例、收集用例、运行用例、生成报告。


pytest安装:
pip install pytest

1、编写用例上:
unitest: 继承TestCase
pytest: 函数/类里面的方法 -- 用例名称必须以test_开头。如果用例在类当中,类名必须以Test开头。

前置后置:
unittest: setup/teardown setupClass,tearDownClass
pytest:
方案一:沿用了unittest的风格。
1、用例级别:setup,teardown -- 类和类外的用例都可以使用
2、类级别:setup_class teardown_class --- 类用
@classmethod
def setup_class(cls):
print(" 类 -- 前置 --")
3、模块级别:setup_module teardown_module

方案二:fixture

断言:
unittest: self.assertXXXXX()
pytest: assert 表达式

2、收集用例和运行用例:
用例分散在多个文件当中。
unittest: TestLoader.discover(目录) - 收集到套件当中。run方法去执行。
pytest:
不需要写任何代码去收集用例 - 自动收集/发现用例的方式。
执行用例的时候会自动收集:
pytest命令行:pytest [参数]

如何自动收集用例的?
1、目录 - 从哪个目录下开始搜索用例。
rootdir: pytest命令在哪个目录下运行,就以哪个目录为rootdir.
2、文件名 - 命名符合test_*.py或者*_test.py条件的文件名,它里边儿是会有用例。
3、函数/类下方法 - 函数名以test_开头
- 以Test开头(不含__init__)的类下的test_开头方法

收集并运行用例:
方式一:
命令行:pytest -s -v 控制台显示详细的用例执行情况
方式二:
python文件:pytest.main([命令行参数])

执行顺序???:
1、文件名:ASCII
2、文件内部:按代码先后顺序


3、生成测试报告:
unittest: HtmlTestRunner、BeautifulReport
pytest: html-插件
html插安装命令:pip install pytest-html

allure-插件
有非常多的插件。allure-插件 重运行-插件


前置后置:
unittest:
setup/teardown
setup当中得到的变量,怎么传递给测试用例的:self.XXX = value
setupClass,tearDownClass
setupClass当中得到的变量,怎么传递给测试用例的:cls.XXX = value

fixture(pytest):

先定义再调用。

定义:
1、函数实现的,函数名称不固定。 --- 如何知道它是前置后置?
@pytest.fixture
def fix():
pass

2、前置操作和后置操作,写在一个函数里。 -- 怎么区分哪些是前置代码?后置代码?
@pytest.fixture
def fix():
前置代码
yeild # 分隔线
后置代码

3、4个作用域。测试函数(function)、测试类(class)、测试模块文件(module)、测试会话(session)
@pytest.fixture(scope=function(默认值)/class/module/session)
def fix():
前置代码
yeild # 分隔线
后置代码

4、不跟测试类/测试函数放在一起。 ---如果说有测试类要用的话,怎么办?需要的时候再调用。


5、前置操作得到的一些数据,如何传递给测试用例?
yeild 返回值

在测试用例当中:以fixture函数名作为用例参数。用例参数接收返回值。
测试函数的参数:1、fixture 2、参数化



5、共享机制:conftest.py
conftest.py 定义fixture,可以定义多个。



调用:
用例/类 主动调用 fixtures.

哪儿需要哪儿调:

@pytest.mark.usefixtures("fixture的函数名称")
测试类/测试函数

如果fixture有返回值,
那么,将它作为测试函数的参数时,则可以不用使用: @pytest.mark.usefixtures("fixture的函数名称")



官方文档:https://docs.pytest.org/en/stable/
pytest+allure集成:https://www.cnblogs.com/Simple-Small/p/11512337.html
pytest文章:https://www.cnblogs.com/Simple-Small/tag/pytest/
posted @ 2020-08-14 11:04  "懒木鱼"  阅读(182)  评论(0)    收藏  举报