通过一串问题来学习pytest.main(),也就是pytest框架的入口。
pytest.main()这个方法有两个入参:
args – 命令行参数的数组
plugins –可以自动注册的插件的数组
1)怎么跑一个testcase?
用pytest创建第一个简单的测试用例, test_sample.py中定义一个方法,并定义一个测试用例:
def add(x):return x + 1def test_answer():assert add(3) == 5
pytest自动化测试的运行可以通过pytest.main执行:
pytest.main(["test_sample.py"])

可以在命令行中看到简单的测试结果的信息。
2)怎么跑多个testcase?
定义了多个test_*命名方式的testcase文件:

可以通过pytest.main(["目录"])的方式运行目录下所有的testcase:
pytest.main(["/cases/module1/"])

可以看到命令行一个简单的汇总,4条case失败,3条成功。
3)怎么通过关键字匹配,只跑部分测试用例,部分跳过?
例如:只想跑TestClass中test_one这个测试用例,其他的不想跑。
class TestClass:def test_one(self):x = "this"assert "h" in xdef test_two(self):x = "hello"assert hasattr(x, "check")
可以通过-k命令行参数,跳过其他testcase的执行
pytest -k "TestClass and not two"或pytest.main(["cases/module1/test_sample.py::test_one"])

4)如何查看测试用例执行报告?
可以通过pytest-allure展示优美的report。
pytest --alluredir=reportsallure generate reports/ -o reports/html
可以生成html的结果报告:


5)怎么对失败的测试用例进行失败重跑?
pytest --reruns=5 #最多重跑次数

可以看到失败的4个case,每个都重跑了5遍,一共重跑了20次。
6)怎么并行去执行测试用例?
一个case执行耗时5秒,那5个就是25秒,怎么可以让它们变快?
pytest -n 5 #(进程数)

可以看到原本串行执行的5个耗时10秒,但是创建了5个进程并行去执行,总时间减少到了2秒。
7)怎么有一条测试用例失败了就退出运行?
pytest -x

遇到第一条失败用例,则不再执行其他的case。
8)怎么自己定义一个命令行参数?
定义一个conftest.py的文件,pytest会自动识别该命名的文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在该package内有效,可有多个conftest.py。下面的例子里新增了一个命令行参数:--env
def pytest_addoption(parser):parser.addoption("--env",action="store",default="test_env1",help="env to setup before test functions",)@pytest.fixturedef env(pytestconfig):return pytestconfig.getoption("--env")
test_env.py
def test_env(env):assert env == "test_env1"
命令行输入:
pytest test_env.py --env=env2

获取到命令行传入的参数,作为testcase的参数。
总结一下:
-s: 显示程序中的print/logging输出
-v: 丰富信息模式, 输出更详细的用例执行信息
-q: 安静模式, 不输出环境信息
-k:关键字匹配,用and区分:匹配范围(文件名、类名、函数名)
--reruns:设置case 失败重跑最大次数
-x: 设置失败了立即返回,不继续执行,可用于调试
-n: 设置并行执行的进程数
通过conftest.py 中pytest_addoption 方法新增命令行参数,并结合fixture使用
今天的分享就到这里,如果文章对你有帮助,记得点赞和转发哦~




