Python unnitest 测试框架
unittest核心工作原理
unittest中最核心的四个概念是:test case, test suite, test runner, test fixture。
下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图:
unnitest
-
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
-
而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
-
TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
-
TextTestRunner(HTMLTestRunner)是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。测试的结果会保存到TextTestResult(HTMLTestResult)实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
-
而对一个测试用例环境的搭建和销毁,是一个fixture。
unittest实例
import unittest
class MyTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("环境已经准备好,执行所有用例开始")
@classmethod
def tearDownClass(cls):
print("所有用例执行完毕")
def setUp(self):
print("start")
def tearDown(self):
print("end")
def test_join(self):
a = 5 + 1;
self.assertEqual(a, 6)
print(a)
def test_join1(self):
b = 5 + 2;
self.assertEqual(b, 7)
print(b)
@unittest.skip
def test_join2(self):
b = 5 + 2;
self.assertEqual(b, 10)
print(b)
if __name__ == "__main__":
suite = unittest.TestSuite()
tests = [MyTest("test_join"), MyTest("test_join1")]
suite.addTests(tests)
runner = unittest.TextTestRunner()
runner.run(suite())
import unittest
#from facade.joinquntest import MyTest
# suite = unittest.TestSuite()
# suite.addTest(MyTest("test_join"))
# suite.addTest(MyTest("test_join1"))
# runner = unittest.TextTestRunner()
# runner.run(suite)
suit = unittest.defaultTestLoader.discover("./","join*.py")
runner = unittest.TextTestRunner()
runner.run(suit)
skip装饰器一共有三个 unittest.skip(reason)、unittest.skipIf(condition, reason)、unittest.skipUnless(condition, reason),skip无条件跳过,skipIf当condition为True时跳过,skipUnless当condition为False时跳过。
进阶——用HTMLTestRunner输出漂亮的HTML报告
我们能够输出txt格式的文本执行报告了,但是文本报告太过简陋,是不是想要更加高大上的HTML报告?但unittest自己可没有带HTML报告,我们只能求助于外部的库了。
HTMLTestRunner是一个第三方的unittest HTML报告库,首先我们下载HTMLTestRunner.py,并放到当前目录下,或者你的’C:\Python36\Lib’下
import unittest
from facade.HTMLTestRunner import HTMLTestRunner
import time
cases = unittest.defaultTestLoader.discover("./facade/","join*.py")
nowtime = time.strftime("%Y-%m-%d:%H:%M:%S")
with(open('./reports/'+nowtime+'result.html', 'wb')) as fp:
runner = HTMLTestRunner(
stream=fp,
title='自动化测试',
description='无其他依赖'
)
runner.run(cases,rerun=0,save_last_run=False)
HTMLTestRunner类说明:
stream : 指定报告的路径
title : 报告的标题
description : 报告的描述
run()方法说明:
suit : 运行的测试套件
rerun :重跑次数
save_last_run :是否保存最后一个结果
总结
- unittest是Python自带的单元测试框架,我们可以用其来作为们自动化测试框架的用例组织执行框架。
- unittest的流程:写好TestCase,然后由TestLoader加TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。
- 一个class继承unittest.TestCase即是一个TestCase,其中以 test开头的方法在load时被加载为一个真正的TestCase。
- verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。
- 可以通过addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。
- 用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境
- 我们可以通过skip,skipIf,skipUnless装饰器跳过某个case,或者用TestCase.skipTest方法。
- 参数中加stream,可以将报告输出到文件:可以用TextTestRunner输出txt报告,以及可以用HTMLTestRunner输出html报告。
原文链接:https://blog.csdn.net/qq_33214066/article/details/107295051