如果想从头学起pytest,可以去看看这个系列的文章!
https://www.cnblogs.com/miki-peng/category/1960108.html
前言
目前有两种纯测试的测试框架,就是unittest和pytest。
unittest这个已经是老框架了并且广为人知,很多人都是用它来做接口自动化或web自动化。它是python内嵌的测试框架,是标准库,即python自带的,安装python以后可以直接导入。unittest提供了test cases、test suites、test fixtures、test runner相关的类,让测试更加明确、方便、可控。
而pytest则是python的第三方库,是基于unittest开发的扩展框架,需要独立安装,但要注意兼容性,不是一定要安装最新版,最新版如果会与你的python版本不兼容,可能会存在安装不成功,或者是某些库的功能使用不了。pytest比unittest更简洁,更高效:
- 不需要像unittest需要使用TestSuite去收集、加载用例添加到测试套件再运行,它会自动发现用例自动执行
- 使用assert断言更简洁:assert 表达式
- 灵活运行指定的测试用例,可以给用例打上各种各样的标签,如:回归、正向、冒烟
- 可以将某些用例跳过(skip),或者对某些预期失败的case标记成失败
- fixture夹具灵活管理环境,可以指定哪些类、方法使用与否,功能相当于unittest的setup,teardown
- 插件非常丰富,如returnfailures用例失败重运行机制,allure更美观的测试报告等
- 较好的兼容性,支持运行unittest/nose编写的测试用例
安装
安装:pip install -U pytest
查看版本:pytest --version
用例命名规则
发现用例规则
pytest是自动发现、收集、执行测试用例的,当你在哪个目录下执行pytest.main()
指令,那么pytest就会自动发现当前目录下所有符合规则的py文件,将这些文件当成测试用例文件,根据以下规则去发现用例:
模块名: test_*.py
或者是 *_test.py
(即以test_开头或_test结尾的py文件)
类名:Test
开头,且类里没有__init__函数(否则容易报错)
方法名:test_
开头
注意:pytest是以方法为单位发现用例的,因此,测试用例并不一定要以类的形式存在,可以直接以函数方法的形式存在;并且它是根据规则按顺序匹配先:模块 > > 类名 > > 方法名,如果你的方法名符合规则,但方法写在一个不符合规则的类名或者模块名下,那么该方法是不会被发现也不会被执行的。
# test_search.py
def login_test():
print(11111)
def test_login():
print(22222)
class TestClass:
def test_one(self):
print(33333)
def test_two(self):
print(44444)
def test3(self):
print(44444)
如上,会查找到3个测试用例,分别为test_login
、test_one
、test_two
。
自定义查找规则
我们还可以自定义查找的规则,但自定义的规则配置文件要放在你要运行的项目的根目录下(见上图),且配置文件要严格以pytest.ini命名,pytest.ini文件内容举例如下:
[pytest] # 只能修改=右边的值
python_files = demo_*.py # 模块名以demo_开头
python_functions = demo_* # 方法名以demo_开头
python_classes = Demo* # 类名名以Demo开头
运行方式
代码形式
if __name__ == '__main__':
pytest.main() # 直接写在py文件中运行,()里可以填写运行的参数,也可以不写
命令行的形式
在pycharm中调出控制台,输入pytest
,会自动去搜索当前目录下所有符合规则的测试用例,也可以指定运行某个文件,如:pytest start.py
。
或者使用windows的cmd命令行,但要先切换到项目的目录下
pycharm运行
右击选择以pytest运行,但一次只能运行单个py文件,除非该文件中有pytest.main()
指令,才会去搜索所在目录的所有测试用例。
运行前在模块中右击可以查看运行是否是以pytest形式运行:
若显示是以unittest形式则会以unittest框架去运行,可以在设置中修改运行方式:
执行代码
以下均为命令行中执行的pytest命令
- 直接执行,在当前目录即子目录搜索用例:
pytest
- 指定某个模块:
pytest test_module.py
- 指定某个目录及子目录下的所有测试文件:
pytest testcase
- 指定某个模块的某个方法,用两个英文冒号分隔:
pytest test_module::test_function
- 指定某个模块的某个类中的某个用例,用两个英文冒号分隔:
pytest test_model.py::test_class::test_method
一些执行参数:
-
-q
:简单打印执行日志,只打印测试用例的执行结果 -
-s
:详细打印执行日志 -
-x
:遇到错误时停止测试 -
--maxfail=num
:当用例错误个数达到指定数量时,停止测试 -
-k
:匹配用例名称- 执行用例名称包含http的所有用例:pytest -s -k http start.py
- 排除用例名称包含http的用例:pytest -s -k "not http" start.py
- 同时匹配不同的用例名称:pytest -s -k "method or weibo" start.py
用例执行顺序
unittest用例的执行顺序是按照方法名的ASCII码顺序执行的,而pytest有自己内置的执行顺序规则,一般是从上往下,即同一个py文件中,从上往下执行测试用例。