pycharm中脚本执行的3种模式(unittest框架、pytest框架、普通模式)
背景知识,某次使用HTMLTestRunner的时候,发现一直都无法导出报告,后来查询资料发现了一些坑,现在整理一下来龙去脉。
一:pycharm默认的是pytest框架去执行unittest框架的测试用例
import unittest
class AlienTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("TestCase start running ")
def test_1_run(self):
print("hello world_1")
def test_2_run(self):
print("hello world_2")
def test_3_run(self):
print("hello world_3")
如上的代码,如果第一次执行,是不会打印任何数据的,最终输出框的代码如下:
============================= test session starts ==============================
platform darwin -- Python 3.6.3, pytest-3.3.1, py-1.5.2, pluggy-0.6.0
rootdir: /Users/test/The_Order_Of_TestCase/TestCase, inifile:
collected 3 items
Alien_Test.py TestCase start running
.hello world_1
.hello world_2
.hello world_3 [100%]
=========================== 3 passed in 0.13 seconds ===========================
通过以上信息,正常打印了,但是通过pytest-3.3.1这个框架去执行的测试用例
现在我们添加3行代码,添加main函数试试
import unittest
class AlienTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("TestCase start running ")
def test_1_run(self):
print("hello world_1")
def test_2_run(self):
print("hello world_2")
def test_3_run(self):
print("hello world_3")
if __name__ == '__main__':
print("hello world")
unittest.main()
如上代码,我们点击main函数这一行去执行脚本,执行过程如下
最终我们会发现,结果和第一个步骤是一样的,由此我们得出结论:
- (1)使用pytest测试框架时候,不需要main()函数,系统可以自动识别测试用例并执行。
- (2)即使包含main()函数,点击它去执行,也不会去执行main()函数。
- (3)具体是使用哪个测试框架执行,不是通过main()函数设置的,在别的地方。
而此时,pycharm右上角的执行框如下所示:
二:python运行脚本的三种模式
通过查阅资料才发现,原来python的运行脚本的方式有多种:
- 例如普通模式运行,不会自动去加载测试用例执行
- unittest 测试框架运行模式,可以自动去发现testcase并执行
- pytest 测试框架运行模式,就是我们上面2个步骤都是使用pytest测试框架运行的
- 重要原则:第一次按照何种模式执行测试用例,后续都会按照这种方式去执行
因为如上2步,我们都是按照pytest模式去执行的,即使添加的main()函数,最终默认的执行方式都是pytest模式。
三:如何修改脚本运行的模式呢?
方法一:修改pycharm默认的测试框架
具体步骤如下:
- (1)这种方式修改完之后,如果某个文件是第一次运行,那默认执行的测试框架是系统默认的框架
- (2)如果某个文件已经通过其他模式运行了,即使更改了系统默认测试框架,也还是按照第一次运行的模式去执行。
方法二:设置运动脚本时候的默认框架
入口一:菜单栏Run—->Run—->Edit Configuration
入口二:右上角运行按钮旁边—>Edit Configurations
通过以上2种入口,进入设置页面如下所示:
上图中,左边的方框运行的内容在Python tests栏目下面,说明脚本已经使用pytest测试框架运行了,但我们系统TestCase是通过Unittest框架运行的
我们需要添加unittest框架的运行模式去运行脚本,具体步骤如下:
最终效果如下:
此时,我们再去执行脚本(点击main()运行或者点击右上角按钮运行结果是一样的)
结果如下:
TestCase start running hello world_1
hello world_2
hello world_3
- 如上的结果说明调用的unittest框架去执行,但是没有调用main()函数。
- 如果单纯为了执行测试用例,不用写main()函数也可以
四:main()函数有啥作用,难道就没点价值吗?
场景一:执行单个测试用例(删除下图右上角脚本运行的记录了)
结果如下:
TestCase start running
hello world_2
说明只执行了一个测试用例,test_2_run
场景二:执行所有测试用例(删除下图右上角脚本运行的记录了)
最终结果如下:
TestCase start running
hello world_1
hello world_2
hello world_3
执行所有测试用例的方法:
其实只要不点击单个测试用例的定义函数的行,无论点击哪一行,即使点击main()函数一行,或者空白行,都可以执行所有测试用例
如果代码比较多的情况加,我们又想尽快执行所有的测试用例,点击main()函数可以执行所以的测试用例,不会出错,目前能想到的就这些……
五:普通模式运行测试用例(删除下图右上角脚本运行的记录了)
结果:
hello world
TestCase start running
hello world_1
hello world_2
hello world_3
- 使用普通模式运行,系统会运行main()函数里面所有的函数,包括非TestCase的函数,当main()函数中有测试报告的需要导出的时候,需要使用普通模式运行。
- 使用pytest或unittest测试框架,在main函数中只执行TestCase函数,其他函数不执行。
六:普通运行模式,导出测试报告
import unittest
import time,HTMLTestRunner
class AlienTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("TestCase start running ")
def test_1_run(self):
print("hello world_1")
def test_2_run(self):
print("hello world_2")
def test_3_run(self):
print("hello world_3")
if __name__ == '__main__':
print('hello world')
suite = unittest.makeSuite(AlienTest)
now = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime())
filename = "/Users/test/The_Order_Of_TestCase/Report/" + now + "_result.html"
fp = open(filename, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'ALIEN测试报告',
description=u'ALIEN用例执行情况:')
runner.run(suite)
# 关闭文件流,不关的话生成的报告是空的
fp.close()
默认是使用unittest模式运行的,结果如下,其实这样不会执行main()函数,更不会导出报告
最终通过创建普通模式的运行模式,然后按照如下方式可以运行
最终测试报告如下:
pycharm中脚本执行的3种模式(unittest框架、pytest框架、普通模式)的更多相关文章
- pycharm 中脚本执行的3种模式
https://blog.csdn.net/chenmozhe22/article/details/81700504
- Python3 Selenium自动化web测试 ==>FAQ:PyCharm中脚本不执行main函数内容解决方案
FAQ: 情景:之前写好可以正常执行的python脚本,突然main函数下的代码不运行 原因:pycharm中,会设置py脚本按照unittest的方式运行,也就是只运行用例,不运行main函数下代码 ...
- iOS中延时执行的几种方式的比较和汇总
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- iOS xib中TableView创建的2种模式
在xcode 5.0中 用xib编辑tableview有2种模式,见下图 其中,dynamic prototype 动态原型 表示tableview会询问它指定的 data source获取数据,如果 ...
- IOS中延时执行的几种方式的比较
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- Unity3D 中脚本执行的先后顺序
Unity3D本身自带有控制脚本执行先后顺序的方法: Edit ---> Project Settings ---> Script Execution Order ---> 值越小 ...
- IOS中延迟执行的几种方法
前几天去国美在线面试,就遇到了上面的问题,当时是笔试,只写出来了第一种方法,现在整理了一下. //1.performSelector方法:在当前线程中执行的方法,使用默认模式,并延迟执行@select ...
- Ogre 中使用OIS的两种模式
关于OIS的输入 要开始考虑游戏输入的问题了,以及开始加入CEGUI也要考虑加入输入的问题.先把OIS的输入简单回忆一下. OIS有两种输入模式:非缓冲输入以及缓冲输入. 无论用哪种输入方式,都应该有 ...
- iOS中图片动画的三种模式及基本的代码实现
-(void)play { //第一种图片动画模式 头尾方式 //头尾方式 [UIView beginAnimations:nil context:nil];//动画开始 [UIView setAni ...
随机推荐
- ecshop属性 {$goods.goods_attr|nl2br} 标签的赋值相关
1.nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />). 2. 如果要向{$goods.goods_attr|nl2br}赋新值,这个值是保存 ...
- 别让CDN的回源把你的服务器拖垮,采用正确的回源策略
我们有一台服务器提供的服务主要是以动态页面为主,静态页面都是固定的内容平时更新的很少,最近这台服务器的应用升级到了新版本访问量增大了不少,随之的问题就来了,最近每天一到9点负载就超过警戒值,然后负载持 ...
- AngularJs数据绑定原理
注 这篇博文主要是写给新手的,是给那些刚刚开始接触Angular,并且想了解数据帮定是如何工作的人.如果你已经对Angular比较了解了,那强烈建议你直接去阅读源代码. Angular用户都想知道数据 ...
- openssl 安装配置
Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用.首先下载Openssl包: ...
- ScrollView中嵌套ListView时,listview高度显示的问题
方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个Lis ...
- 【extjs6学习笔记】0.3 准备:系统架构
- linux各文件夹的作用(转)
转自:http://www.cnblogs.com/amboyna/archive/2008/02/16/1070474.html linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可 ...
- 更改IDEA默认使用JDK1.5编译项目
在使用IDEA编译项目时,总是提示我编译失败,有些功能是在1.5之后的版本才支持.废了好大的功夫才编译成功.下面呢,就是更改编译的过程了! 一.初步更改 使用快捷键Ctrl+Alt+Shift+S打开 ...
- 初习mysql procedure
1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户 ...
- 使用memcached缓存 替代solr中的LRUCache缓存
前沿 在搜索引擎中,缓存被当做是不可缺少的部分,但是很多情况下,将缓存的实现过度依赖于分发服务器及webserver会很大程度上加重webserver 的负担,具体表现就是经常性的假死,拒绝服务,因此 ...