关于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了吧。

  • 结论:单文件,建议修改模式;多文件(项目),写一个单独的文件来运行cases,模式不重要。

FAQ 关于allure和pycharm的运行模式的更多相关文章

  1. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  2. selenium - pycharm三种案例运行模式

    1.unittest 运行单个用例 (1)将鼠标放到对应的用例,右键运行即可 2.unittest运行整个脚本案例 将鼠标放到if __name__ == "__main__": ...

  3. spark之scala程序开发(集群运行模式):单词出现次数统计

    准备工作: 将运行Scala-Eclipse的机器节点(CloudDeskTop)内存调整至4G,因为需要在该节点上跑本地(local)Spark程序,本地Spark程序会启动Worker进程耗用大量 ...

  4. 脚本可执行,但无HTML测试报告文件生成,其造成的原因是在PyCharm的执行模式错误

    定义测试报告两种写法: 1)测试报告直接在本地绝对路径下生成 # 导入HTMLTestRunner模块 import HTMLTestRunner # 通过open()方法以二进制写模式('wb')打 ...

  5. hadoop本地运行模式调试

    一:简介 最近学习hadoop本地运行模式,在运行期间遇到一些问题,记录下来备用:以运行hadoop下wordcount为例子. hadoop程序是在集群运行还是在本地运行取决于下面两个参数的设置,第 ...

  6. Spark运行模式与Standalone模式部署

    上节中简单的介绍了Spark的一些概念还有Spark生态圈的一些情况,这里主要是介绍Spark运行模式与Spark Standalone模式的部署: Spark运行模式 在Spark中存在着多种运行模 ...

  7. PHP运行模式

    1.运行模式 关于PHP目前比较常见的五大运行模式: 1)CGI(通用网关接口 / Common Gateway Interface) 2)FastCGI(常驻型CGI / Long-Live CGI ...

  8. 【转】Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式

    转载地址:http://www.oschina.net/question/54100_16195   tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或 ...

  9. Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化

    Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomc ...

  10. javascript运行模式:并发模型 与Event Loop

    看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...

随机推荐

  1. 网络协议之:redis protocol 详解

    目录 简介 redis的高级用法 Redis中的pipline Redis中的Pub/Sub RESP protocol Simple Strings Bulk Strings RESP Intege ...

  2. 第一百零六篇:变量的不同声明(var,let和const的不同)

    好家伙,JS基础接着学, 本篇内容为<JS高级程序设计>第三章学习笔记 1.变量 ECMAScript 变量是松散类型的,意思是变量可以用于保存任何类型的数据. (确实松散,不像C或C++ ...

  3. 记一次HTTPClient模拟登录获取Cookie的开发历程

    记一次HTTPClient模拟登录获取Cookie的开发历程 环境: ​ springboot : 2.7 ​ jdk: 1.8 ​ httpClient : 4.5.13 设计方案 ​ 通过新建一个 ...

  4. Flink同步Kafka数据到ClickHouse分布式表

    公众号文章都在个人博客网站:https://www.ikeguang.com/ 同步,欢迎访问. 业务需要一种OLAP引擎,可以做到实时写入存储和查询计算功能,提供高效.稳健的实时数据服务,最终决定C ...

  5. python之xlsx合并单元格

    需求背景: 工作中将数据保存xlsx文件之后,里面每一列中有很多重复的看着很不美观,需要将每一列中的相同值合并起来,是表格看起来美观简洁 处理前 处理后 直接上代码(内涵注释讲解) "&qu ...

  6. SpringBoot中搭配AOP实现自定义注解

    1 springBoot的依赖 确定项目中包含可以注解的依赖 <dependency> <groupId>org.springframework.boot</groupI ...

  7. 大数据HDFS凭啥能存下百亿数据?

    欢迎关注大数据系列课程 前言 大家平时经常用的百度网盘存放电影.照片.文档等,那有想过百度网盘是如何存下那么多文件的呢?难到是用一台计算机器存的吗?那得多大磁盘啊?显然不是的,那本文就带大家揭秘. 分 ...

  8. Flutter和Rust如何优雅的交互

    前言 文章的图片链接都是在github上,可能需要...你懂得:本文含有大量关键步骤配置图片,强烈建议在合适环境下阅读 Flutter直接调用C层还是蛮有魅力,想想你练习C++,然后直接能用flutt ...

  9. Django框架:10、Ajax补充说明、多对多三种创建方法、Django内置序列化组件、批量操作数据方法、分页器思路、form组件

    Django框架 目录 Django框架 一.Ajax补充说明 1.针对前端回调函数接受值的说明 二.多对多三种创建方式 1.自动创建 2.纯手动创建 3.半自动创建 三.Django内置序列化组件 ...

  10. 解读JVM级别本地缓存Caffeine青出于蓝的要诀3 —— 讲透Caffeine的数据驱逐淘汰机制与用法

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 上一篇文章中,我们聊了下Caffein ...