目录
一、安装
二、语法
三、执行
四、前后置setup/teardown
五、fixture
六、数据驱动
七、报告
一、安装
需要安装的库
pytest
pytest-html 生成HTML格式的测试报告
pytest-xdist 用例分布式执行,多CPU分发
pytest-ordering 改变用例执行顺序
pytest-rerunfailures 用例失败重跑
allure-pytest 生成allure测试报告
pyYAML yaml文件库
安装命令
# 将要安装的库放到 requirements.txt 文件中,然后执行
pip install -r requirements.txt
二、语法
-
模块名(用例文件名)必须以
test_
开头或者_test
结尾 -
测试类必须以
Test
开头,且不能有init
方法 -
测试方法必须以
test
开头
三、执行
执行命令
-
主函数
# test_login.py
import pytestclass TestLogin:def test_01(self):print("用例1")if __name__ == '__main__':pytest.main() # 执行所有
-
命令行
# 在命令行中切换到对应目录下后,直接命令行输入
pytest
-
读取
pytest.ini
配置文件
pytest.ini
是pytest单元测试框架的核心配置文件,用来改变pytest默认的行为
-
一般放在项目的根目录;
-
编码必须是
ANSI
[pytest]
addopts = -vs
testpaths = ./project
python_files = test*.py
python_classes = Test*
python_functions = test
-
addopts 命令行参数
-
testpaths 测试用例文件夹
-
python_files 搜索文件名
-
python_classes 搜索的测试类名
-
python_functions 搜索的测试方法名的开头
执行命令参数
-s 输入调试信息,如用例中的print
-v 打印信息更详细
文件名(或文件夹) 指定运行文件(或文件夹里文件)用例
-n 分布式运行
--reruns 2 失败重跑(失败重跑2次,加上第一次一共跑了3次)
-x 只要有一个用例报错,测试停止
--maxfail=2 最多出现两个用例报错,测试停止
-k "方法名包含的字符" 根据用例部分字符串执行指定用例
例如
# 主函数
pytest.main(['-vs', 'test_login.py', '-n=2', '--reruns=2'])
# 使用nodeid 执行指定方法
pytest.main(['-vs', './文件名/类名::方法名'])
# 命令行
pytest -vs -n 2 --reruns 2 -k "login "
执行顺序
unittest根据ASCII码;pytest:从上到下
改变执行顺序:
# 使这个用例第一个执行
@pytest.mark.run(order=1)
def test_login():print("Done")
分组执行
pytest.ini
文件添加:
markers = smoke: 冒烟用例login: 登录用例
用例文件:
@pytest.mark.smoke
def test_login2():print("Done")
命令行执行命令:
pytest -vs -m "smoke"
# 执行多个分组
pytest -vs -m "smoke or login"
跳过测试用例
# 无条件跳过
@pytest.mark.skip(reason="跳过原因")
# 符合条件跳过
@pytest.mark.skipif(num>3, reason="数量超过3个")
四、前后置
每个用例都有的功能,可以集体提取出来,比如UI自动化的执行前打开浏览器、执行结束后关闭浏览器的操作
# test_login.py
import pytestclass TestLogin:# 在所有用例之前,只执行一次def setup_class(self):print("在类执行前执行,比如创建日志对象、创建数据库连接")# 在每个用例之前都会执行一次def setup(self):print("每个用例执行前先执行setup:打开浏览器,加载网页")def test_01(self):print("用例1")def teardown(self):print("每个用例执行结束后执行teardown:关闭浏览器")def teardown_class(self):print("类执行结束后,执行一次,比如:销毁日志对象、关闭数据库连接")if __name__ == '__main__':pytest.main() # 执行所有
五、fixture
用fixture
实现部分用例的前后置
@pytest.fixture()
参数
-
scope:被标记方法的作用域,function(默认)、class、module、package/session
-
params:参数化
-
autouse:自动执行,默认False
-
ids:使用params参数化时,给每个值设置一个变量名
-
name:给被标记的方法起一个别名【当取了别名以后,原名就不能用了】
import pytest@pytest.fixture()
def my_fixture():print("这是前置方法")yieldprint("这是后置方法")class TestLogin:def test01(self):print("用例1")# 这个用例执行前会先执行my_fixture方法# 用例执行完后会执行my_fixture的yielddef test_02(self, my_fixture):print("用例2")
如果所有方法有前后置需要,则在fixture里加参数autouse=True
,用例里也不需要写fixture名调用
@pytest.fixture(autouse=True)
...省略...
class TestLogin:def test01(self):print("用例1")
params参数化
params支持列表、元组、字典列表、字典元组
import pytest@pytest.fixture(scope='function', params=["亚索", "凯南", "腕豪"])
def my_fixture(request):yield request.paramprint("后置")class TestLogin:def test01(self, my_fixture):print("得到参数:", my_fixture)
工程应用
通过conftest.py
和@pytest.fixture()
结合使用,实现全局前后置
conftest.py 文件是单独存放fixture的配置文件,用处是可以在不同的py文件中使用同一个fixture函数,使用时原则上需要将conftest.py文件和用例放到同一层(放在根目录貌似也可以),并且不需要导入。且可以存在多个conftest.py文件(放在不同文件夹中)。调用也可以调用多个:
def test_01(self, my_fixture1, my_fixture2)
上面调用方式就是先调my_fixture1,再调用my_fixture2。
六、数据驱动
@pytest.mark.parametrize(args_name, args_value)
-
args_name:参数名
-
args_value:参数值;有多少参数值,用例就会执行多少次
例1:
import pytestclass TestLogin:@pytest.mark.parametrize('args', ['北京', '上海', '广州'])def test_01(self, args):print(args)if __name__ == '__main__':pytest.main()
例2:
import pytestclass TestLogin:@pytest.mark.parametrize('city, rank', [['北京', '1'], ['上海', '2'], ['广州', '3']])def test_01(self, city, rank):print(city, rank)if __name__ == '__main__':pytest.main()
七、报告
-
下载allure,解压,配置环境变量
-
添加执行参数 --alluredir,可以去pytest.ini文件中修改(如下)。也可以在主函数中添加
pytest.main(['--alluredir=./temp'])
这样生成的json文件会放到temp文件夹中
[pytest]
addopts = -vs --alluredir ./temp
testpaths = ./project
python_files = test*.py
python_classes = Test*
python_functions = test
-
在主函数下增加代码
if __name__ == '__main__':pytest.main()os.system('allure generate ./temp -o ./report --clean')
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。