背景知识,某次使用HTMLTestRunner的时候,发现一直都无法导出报告,后来查询资料发现了一些坑,现在整理一下来龙去脉。
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函数这一行去执行脚本,执行过程如下
最终我们会发现,结果和第一个步骤是一样的,由此我们得出结论:
而此时,pycharm右上角的执行框如下所示:
通过查阅资料才发现,原来python的运行脚本的方式有多种:
因为如上2步,我们都是按照pytest模式去执行的,即使添加的main()函数,最终默认的执行方式都是pytest模式。
- (1)这种方式修改完之后,如果某个文件是第一次运行,那默认执行的测试框架是系统默认的框架
- (2)如果某个文件已经通过其他模式运行了,即使更改了系统默认测试框架,也还是按照第一次运行的模式去执行。
入口一:菜单栏Run—->Run—->Edit Configuration
入口二:右上角运行按钮旁边—>Edit Configurations
上图中,左边的方框运行的内容在Python tests栏目下面,说明脚本已经使用pytest测试框架运行了,但我们系统TestCase是通过Unittest框架运行的
我们需要添加unittest框架的运行模式去运行脚本,具体步骤如下:
此时,我们再去执行脚本(点击main()运行或者点击右上角按钮运行结果是一样的)
结果如下:
TestCase start running hello world_1
hello world_2
hello world_3
- 如上的结果说明调用的unittest框架去执行,但是没有调用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()