入门指南:使用Python的pytest测试框架(第一部分)
一、框架介绍及安装
pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。
安装 pip install pytest
我这里已经安装成功了
二、框架使用流程
创建如下的源码文件test_one.py
def add(x,y):
return x+y
def test_add_1():
assert add(1,2)==3
cmd窗口中切换到源文件所在的目录
接着运行pytest文件,有三种运行方法
运行pytest命令,或py.test命令,或python –m pytest命令。
pytest运行规则
1.查找当前目录及其子目录下以test_*.py或***_test.py文件。
2.找到文件后,在文件中找到以test开头函数**并执行。
所以你 在创建pytest文件的时候必须要注意需要以test开头或者结尾,用例要以test开头,这个跟unittest是一样的
如果目录下有比较多模块你只想执行某一个的时候可以这样做
pytest test_one.py(执行第一个测试文件)
用例设计原则
文件名以test_.py文件test.py
测试类以Test开头,并且不能带有init方法
以test_开头的函数
以Test开头的类
以test_开头的方法
所有的包pakege必须要有__init_.py文件
断言使用assert
运行.py模块里面的某个函数
pytest test_mod.py::test_func
运行.py模块里面,测试类里面的某个方法
pytest test_mod.py::TestClass::test_method
三、断言
常用断言
pytest里面断言实际上就是python里面的assert断言方法,常用的有以下几种:
assert xx 判断xx为真
assert not xx 判断xx不为真
assert a in b 判断b包含a
assert a == b 判断a等于b
assert a != b 判断a不等于b
四、装饰器
标记表达式
pytest -m slow
将运行用**@ pytest.mark.slow**装饰器修饰的所有测试。
import pytest
def add(x,y):
return x+y
def test_add_1():
assert add(1,2)==3
@pytest.mark.demo1
def test_add_2():
assert add(1,3)==3
@pytest.mark.demo1
def test_passing():
assert (1,2,3)==(1,2,3)
上面的代码块中如果我执行
pytest -m demo1
则只会执行test_add_2()和test_passing(),其他的则不执行,如果在程序运行过程中你想执行不同文件中的某些测试方法但是这些测试方法名字不一样,你就可以通过装饰器的方法进行标记。
skip
实际工作中可能会因为某些功能还没去完全完成或者是bug还没修复,可以在测试的时候可以选择跳过这个test_case,这里我们就可以用skip去完成。
跳过测试函数的最简单方法是使用跳过装饰器标记它,可以传递一个可选的原因。
@pytest.mark.skip(reason=“本轮测试不执行此用例")
def test_the_unknown():
@pytest.mark.skip(reason='skip')
def test_function():
....
skipif
某些时候并不想所有的test_case都被跳过,想某种情况下才跳过,这里的话就可以使用skipif来完成
import sys
@pytest.mark.skipif(sys.version_info < (3,3),
reason="requires python3.3")
def test_function():
...
可以在模块之间共享 skipif 标记。
对于较大的测试套件,通常最好有一个文件来定义标记,然后一致适用于整个测试套件。下面是将测试
minversion = pytest.mark.skipif(5>3,reason=“test")
@minversion
def test_function():
...
共享之前需要先导入minversion
from test_mymodule import minversion
注意:使用pytest.skip(reason=’’),注意这个就不再是一个装饰器了,而仅仅是一个函数了。此外需要注意的是,pytest.skip()放置位置对test case的执行至关重要。如果只放在一个test case中,则仅仅会skip掉这一个test case,比如:
import pytest
def test_123():
pytest.skip("Not implemented")
assert 1 == 0
def test_234():
assert 1 == 0
这里会只跳过test_123()这个用例
如果把pytest_skip()放在了test_函数之外,则整个文件下的test cases都会被skip掉而不被执行。如下所示:
import pytest
pytest.skip("Not implemented")
def test_123():
assert 1 == 0
def test_234():
assert 1 == 0
这里所有的用例都会被跳过
推荐阅读
-
深入探索UI自动化测试实战:Python+Selenium+Pytest+Allure组合的详细解析,剖析元素交互技巧(精华篇)(第一部分)-引言
-
Pytest自动化测试框架入门指南:必备基础知识第一弹
-
入门pytest:Python自动化测试框架的第一步
-
入门指南:轻松掌握Python自动化测试工具pytest的安装与使用
-
Pytest初探:安装与使用指南 - 详解Python测试框架的第一步
-
入门指南:使用Python的pytest测试框架(第一部分)
-
Python自动化测试:使用Pytest框架的完整指南
-
轻松入门 Python 测试工具 Pytest 的指南
-
Pytest: 一个简单易用的Python测试框架入门指南
-
入门pytest测试框架(第一部分)