关于allure和pycharm的运行模式

文章详细探讨了在PyCharm中使用allure和pytest进行测试时遇到的问题,包括pytest.main函数未执行、allure报告未生成以及如何修改PyCharm的运行模式(从pytest改为unittest)来解决问题。通过创建run_cases.py文件实现批量运行测试用例并生成allure报告,证明了修改运行模式的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于allure和pycharm的运行模式

案例

  • 新建一个项目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的)
    在这里插入图片描述

  • 注意此时的右键运行菜单
    在这里插入图片描述

  • 运行效果:注意左侧的测试结果没有了(上图2,所以如果我看到图2的内容,我就知道你的模式并不对)

    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了吧。
### 如何在 PyCharm 中安装配置 Allure #### 一、PyCharm 中安装 `allure-pytest` 插件 为了能够在 PyCharm 中正常使用 Allure 报告功能,需要先通过 Python 的包管理工具 `pip` 来安装 `allure-pytest`。 1. 打开 PyCharm 软件,在菜单栏依次选择 **File -> Settings**。 2. 进入设置界面后,找到左侧导航中的 **Project: {Your Project Name} -> Python Interpreter**。 3. 在右上角点击加号按钮(+),打开可用软件列表窗口。 4. 在搜索框中输入 `allure-pytest` 并选中对应的选项,随后点击下方的 **Install Package** 按钮完成安装[^1]。 #### 二、Allure 工具本身的安装与环境配置 除了在 PyCharm 中安装依赖库外,还需要单独安装 Allure 工具本身并将其加入系统的 PATH 环境变量中以便全局调用。 1. 下载官方发布的最新版 Allure 压缩文件或者利用百度网盘链接进行获取: - 官方地址:访问 [Allure GitHub Releases](https://github.com/allure-framework/allure2/releases),挑选适合操作系统的版本下载下来解压缩即可; - 备用资源:如果网络条件不允许直接从国外站点拉取数据,则可以考虑国内存储服务提供者分享出来的副本,比如这里提到的一个例子——提取码:m047 对应于指定位置上的资料集[^2]。 2. 设置好之后记得把解压后的 bin 文件夹路径补充至操作系统级别的 Path 变量里去。这样做的好处是可以让命令行终端识别到 allure 关键字从而执行相应动作。 3. 测试一下是否成功设置了该程序为可执行状态的方法很简单,只需切换到任意空白处启动 CMD 控制台然后尝试运行如下指令来确认当前已加载的具体发行编号信息: ```bash allure --version ``` #### 三、验证集成效果以及生成测试报告流程说明 当以上准备工作都完成后就可以着手编写基于 pytest 框架下的自动化脚本啦!与此同时别忘了按照既定规则标注每一步骤产生的日志记录点位哦~ 最后要提醒大家注意一点就是每次跑完一轮完整的回归测验之后都需要手动触发一次汇总过程才能看到最终呈现形式美观大方的结果页面哟~ ```python pytest test_file.py --alluredir=./result ``` 接着再借助之前已经妥善安置到位的那个独立应用程序开启图形化展示模式吧! ```bash allure serve ./result ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值