linux下的Python默认一般比较老旧,使用时需要先升级
完成后,可通过:python3 --version
验证是否成功。
pytest是一个非常成熟的全功能的Python测试框架
安装:pip3 install -U pytest
检查是否安装成功:pytest –version
有时安装后pytest无法直接使用,则:python3 -m pytest
若安装时提示Could not fetch URL https://pypi.org
,可:
python3 -m pip install pyyaml -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
或者:
pip3 install pywinauto -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
1)http://mirrors.aliyun.com/pypi/simple/ 阿里云
2)https://pypi.mirrors.ustc.edu.cn/simple/ 中国科技大学
3) http://pypi.douban.com/simple/ 豆瓣
4) https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学
5) http://pypi.mirrors.ustc.edu.cn/simple/ 中国科学技术大学
一般还需要依赖一些其他包:
pip3 install pyyaml
pip3 install requests
pip3 install pytest-ordering
pytest 不带任何参数,将查看当前目录(或其他一些预配置的目录)以及子目录下所有测试文件,并运行找到的测试代码。
test_
开头Test
开头,并且不能带有 init 方法test_
开头运行:
# -s:打印print输出内容
# -r[s/E/f/x/a]: 打印对应项的额外信息 (f)ailed, (E)rror, (s)kipped, (x)failed,
# (X)passed, (p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll
# --tb=short: 遇到错误时,只打印错误行
# -v: 显示测试的详细参数信息
pytest -rs -s --tb=short
# pytest --collect-only # 只显示要测试的示例信息,不真正测试
参数方式运行(所有的参数放在列表中,每个参数就是列表中的一个元素):
if __name__ == "__main__":
pytest.main(['-v','-s'])
在测试中会经常需要跳过一些用例:
# 跳过测试函数(放在函数上)
@pytest.mark.skip(reason="test only")
@pytest.mark.skipif(reason="test only")
# 跳过整个模块(整个模块,包括不同目录下的所有文件)
pytest.skip("skipping session tests", allow_module_level=True)
# 跳过指定文件:添加conftest.py文件,把要忽略的文件放在collect_ignore列表中
collect_ignore = ["session/session_test.py"]
通过标识来方便跳过测试文件(conftest.py):
import glob
import os
SKIP_Session = False
# SKIP_Session = True
collect_ignore = []
if SKIP_Session:
for file in glob.glob("./session/*_test.py"):
collect_ignore.append(file)
很多测试用例,需要使用不同的参数来调用(如不同的边界条),这时就需要使用parametrize
:
# @pytest.mark.parametrize 参数调用
参数调用时,若使用全局变量,其值必须是预设定好的(通过setup_module修改无效,parametrize获取的值应在setup_module调取之前)
@pytest.mark.parametrize("fIndex, expectCode", [
(0, base.CodeSuccess),
(1, base.CodeFileInvalid),
])
def test_createSession(fIndex, expectCode):
pass
pytest-ordering可设定测试用例的执行顺序;
pip install pytest-ordering
# 设定执行顺序(@pytest.mark.run(order=1),修饰属性执行顺序 0、1、2......-2、-1,
# 多个文件顺序交叉时,会分段执行(分割为多个子测试去执行,setup也会多次调用))
# @pytest.mark.run(after = 'test_second')
# @pytest.mark.run(before = 'test_second')
装载运行级别:
import pytest
# 模块中的方法
def setup_module():
print("setup_module:整个.py模块只执行一次(进入py文件时,执行一次)")
def teardown_module():
print("teardown_module:整个.py模块只执行一次(退出py文件时,执行一次)")
def setup_function():
print("setup_function:每个函数测试用例开始前都会执行(本例中test_one、test_two执行前)")
def teardown_function():
print("teardown_function:每个函数测试用例结束后都会执行(本例中test_one、test_two执行后)")
# 测试模块中的用例1
def test_one():
print("正在执行测试模块----test_one")
# 测试模块中的用例2
def test_two():
print("正在执行测试模块----test_two")
# 测试类
class TestCase():
def setup_class(self):
print("setup_class:所有类中测试用例执行之前(进入类时,执行一次)")
def teardown_class(self):
print("teardown_class:所有类中测试用例执行之后(退出类时,执行一次)")
def setup(self):
print("setup:每个用例开始前都会执行(本例中test_three、test_four执行前)")
def teardown(self):
print("teardown:每个用例结束后都会执行(本例中test_three、test_four执行后)")
def test_three(self):
print("正在执行测试类----test_three")
def test_four(self):
print("正在执行测试类----test_four")
if __name__ == "__main__":
pytest.main(["-s", "test_module.py"])