案例
新建一个项目allure_mode
新建一个python代码test_allure_001.py
代码如下
import pytest, os
def test_001():
assert 1 == 1
if __name__ == '__main__':
pytest.main(['-sv', __file__, '--alluredir', './html', '--clean-alluredir'])
os.system(f'allure serve ./html')
右键运行(注意样式)
运行结果:注意底部右侧的测试结果区域
用例看着没问题,但问题来了。
pytest.main那一行的作用是测试该代码(好像测了),--alluredir参数的意思是会生成一个allure报告所需的json到当前目录下的html文件夹下,然后清空上次的内容。现在看很奇怪的是执行了部分?压根就没有生成allure报告所需的内容
os.system这一行的作用是打开html目录中的文件,生成一个allure的报告(启动一个web 服务器)。压根就没做。
测试
在pytest.main之前加一句打印
...
if __name__ == '__main__':
print('发生了什么')
pytest.main..
os.system
结果是:print也不会打印
证明了:if这个判断似乎就不成立?
跟我们以前学的python基础略有冲突,因为我们当前文件的__name__就是等于__main__的
你认识的没有问题,一切都是因为现在的这个模式,第一张图。你现在是pytest在运行你的测试用例,它并不会关心if这个判断下的内容(为啥?不知道了。)
所以我们都会让你修改模式
修改pycharm的运行模式
文件->设置->工具->Python 集成工具-> 测试- > 默认测试运行程序:改为unittest(注意自动检测是pytest的)
注意此时的右键运行菜单
D:\Python39\python.exe D:/pythonProject/AutoTest/allure_mode/test_allure_001.py
发生了什么
============================= test session starts =============================
platform win32 -- Python 3.9.6, pytest-7.1.2, pluggy-1.0.0 -- D:\Python39\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.9.6', 'Platform': 'Windows-10-10.0.19044-SP0', 'Packages': {'pytest': '7.1.2', 'py': '1.11.0', 'pluggy': '1.0.0'}, 'Plugins': {'allure-pytest': '2.9.45', 'anyio': '3.5.0', 'Faker': '13.3.4', 'assume': '2.4.3', 'base-url': '1.4.2', 'dependency': '0.5.1', 'forked': '1.4.0', 'html': '3.1.1', 'instafail': '0.4.2', 'metadata': '1.11.0', 'ordering': '0.6', 'repeat': '0.9.1', 'rerunfailures': '10.2', 'sugar': '0.9.4', 'timeout': '2.1.0', 'xdist': '2.5.0'}, 'JAVA_HOME': 'D:\\Java\\jdk1.8.0_301\\', 'Base URL': ''}
rootdir: D:\pythonProject\AutoTest\allure_mode
plugins: allure-pytest-2.9.45, anyio-3.5.0, Faker-13.3.4, assume-2.4.3, base-url-1.4.2, dependency-0.5.1, forked-1.4.0, html-3.1.1, instafail-0.4.2, metadata-1.11.0, ordering-0.6, repeat-0.9.1, rerunfailures-10.2, sugar-0.9.4, timeout-2.1.0, xdist-2.5.0
collecting ... collected 1 item
test_allure_001.py::test_001 PASSED
============================== 1 passed in 0.06s ==============================
Generating report to temp directory...
Report successfully generated to C:\Users\SONGQI~1\AppData\Local\Temp\6816591429229290427\allure-report
Starting web server...
2022-08-23 15:17:07.287:INFO::main: Logging initialized @1991ms to org.eclipse.jetty.util.log.StdErrLog
Server started at <http://192.168.10.147:2587/>. Press <Ctrl+C> to exit
输出了print的内容
当前目录下也有了html目录,及里面的内容
报告也自动打开了
结论:当时unittest模式的情况下,if下面的语句能正常执行,不会被抛弃,所以都生效了(print语句,pytest.main,os.system等)
还没完
是的,上面似乎已经解决了你的问题。但pycharm会这么low吗?默认检测的不对?而且如果是新建的项目,你可能还要再次设置。
你可以做以下测试
删除新生成的html目录
把if语句及其下面的都去掉
模式改回pytest
复制一个001为002
像这样:很简单
编写一个run_cases.py,命名并无要求,意思就是运行所有的case
import pytest
import os
pytest.main(['-sv', '--alluredir', './html', '--clean-alluredir'])
os.system(f'allure serve ./html')
注意去掉了__file__
没有if main啥的了
注意右键菜单
执行效果:很好,就是pytest,allure报告也生成了,就不截图了
D:\Python39\python.exe D:/pythonProject/AutoTest/allure_mode/run_cases.py
============================= test session starts =============================
platform win32 -- Python 3.9.6, pytest-7.1.2, pluggy-1.0.0 -- D:\Python39\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.9.6', 'Platform': 'Windows-10-10.0.19044-SP0', 'Packages': {'pytest': '7.1.2', 'py': '1.11.0', 'pluggy': '1.0.0'}, 'Plugins': {'allure-pytest': '2.9.45', 'anyio': '3.5.0', 'Faker': '13.3.4', 'assume': '2.4.3', 'base-url': '1.4.2', 'dependency': '0.5.1', 'forked': '1.4.0', 'html': '3.1.1', 'instafail': '0.4.2', 'metadata': '1.11.0', 'ordering': '0.6', 'repeat': '0.9.1', 'rerunfailures': '10.2', 'sugar': '0.9.4', 'timeout': '2.1.0', 'xdist': '2.5.0'}, 'JAVA_HOME': 'D:\\Java\\jdk1.8.0_301\\', 'Base URL': ''}
rootdir: D:\pythonProject\AutoTest\allure_mode
plugins: allure-pytest-2.9.45, anyio-3.5.0, Faker-13.3.4, assume-2.4.3, base-url-1.4.2, dependency-0.5.1, forked-1.4.0, html-3.1.1, instafail-0.4.2, metadata-1.11.0, ordering-0.6, repeat-0.9.1, rerunfailures-10.2, sugar-0.9.4, timeout-2.1.0, xdist-2.5.0
collecting ... collected 2 items
test_allure_001.py::test_001 PASSED
test_allure_002.py::test_002 PASSED
============================== 2 passed in 0.06s ==============================
Generating report to temp directory...
Report successfully generated to C:\Users\SONGQI~1\AppData\Local\Temp\2213206012790709893\allure-report
Starting web server...
2022-08-23 15:29:58.558:INFO::main: Logging initialized @3280ms to org.eclipse.jetty.util.log.StdErrLog
Server started at <http://192.168.10.147:4502/>. Press <Ctrl+C> to exit
多数情况下你测试你的cases的时候并不会去写if main,那是调试一个case的一种方式,你要批量运行的,所以pycharm的模式并没有问题。
我偏要测试一个文件,还要用pytest模式,可以吗?
真倔哎(自说自话)
答案:当然是可以!这本来就是可以的。
前面我们已经证明了,if语句下的在pytest模式下并不会运行,改为unittest模式可以了。
那就不要if!
import pytest,os
def test_001():
assert 1 == 1
pytest.main(['-sv', __file__,'--alluredir', './html', '--clean-alluredir'])
os.system(f'allure serve ./html')
执行的话也能看到报告
但是!你不可能就一个case的,你如果要多用例一起调用,这个case里面的这2行(pytest.main和os.system)就不应该有。
所以...
说在最后
也可以通过修改pytest项目的配置来解决这个问题,此处不表
实践是最好的理解方式,老师给你的往往是他的理解,其实也未必就100%对,当然现在这种做法我也只是探究了部分,也有不太理解的方式,没必要深究,能完成你的任务就ok了吧。
最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】
全套资料获取方式:点击下方小卡片自行领取即可