Python 单元测试
Posted 安柠筱洁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 单元测试相关的知识,希望对你有一定的参考价值。
一,单元测试
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
单元测试的加载:通过unittest.main()来启动单元测试的测试模块;添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例。
补充查看模块内容及使用方法 代码如下:
import unittest
import HTMLTestRunner
from BeautifulReport import BeautifulReport
memblist1 = dir(unittest) # 查看模块有哪些成员
for memb in memblist1 : #查看具体成员的用法
cur = getattr(unittest,memb)
print(help(cur))
memblist = dir(HTMLTestRunner) # 查看模块有哪些成员
for memb in memblist : #查看具体成员的用法
cur = getattr(HTMLTestRunner,memb)
print(help(cur))
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
整个单元测试框架的逻辑分三步走:第一步testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,
然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。
而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;
在第二步中把自身模块中的所有测试类中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。
常用断言:
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
实例:
import unittest
def calc(x,y): #被测模块
return x+y
class TestCalc(unittest.TestCase):#单元测试模块
def test_pass_case(self):
\'\'\'这是通过的测试用例\'\'\'
print(\'这个通过用例\')
res = calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(2,res)#返回的结果不一样
def test_fail_case(self):
\'\'\'这是失败的测试用例\'\'\'
print(\'这个是失败的用例\')
res = calc(1, 2)
self.assertEqual(5, res)
if __name__ ==\'__main__\':
unittest.main() #他会帮你运行当前这个python里面所有的测试用例。
注:以test
开头的方法就是测试方法,不以test
开头的方法不被认为是测试方法,测试的时候不会被执行。用例执行的顺序是按照字母排列的顺序来的
输出结果::【F表示一个fail, F前的点表示一个通过,有E的话表示程序自身异常】
F.
======================================================================
FAIL: test_fail_case (__main__.TestCalc)
这是失败的测试用例
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/lidal/PycharmProjects/llq-code/day7/练习.py", line 16, in test_fail_case
self.assertEqual(5, res)
AssertionError: 5 != 3
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)
二,setUp 与 tearDown
setUp() 与 tearDown() 这两个方法会分别在每调用一个测试方法的前后分别被执行
setUp()
和tearDown()
方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()
方法中连接数据库,在tearDown()
方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:
class TestCalc(unittest.TestCase):#单元测试模块
def test_pass_case(self):
\'\'\'这是通过的测试用例\'\'\'
print(\'这个通过用例\')
res = calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(2,res)#返回的结果不一样
def test_fail_case(self):
\'\'\'这是失败的测试用例\'\'\'
print(\'这个是失败的用例\')
res = calc(1, 2)
self.assertEqual(5, res)
def test_a(self):
print(\'hahahaha \')
def setUp(self):
print(\'setUp。。\')
# 每个用例运行之前都会执行它
def tearDown(self):
# 每个用用例运行完之后都会执行它
print(\'tearDown。。\')
三,setUpClass 与 tearDownClass
setUpClass() 与 tearDownClass()这两个方法会在所有的用例执行前后执行一次
使用方法如下:
@classmethod
def setUpClass(cls):
print(\'我是setupClass\')
@classmethod
def tearDownClass(cls):
print(\'我是tearDownClass\')
四,输出html 格式的测试报告
a,需安装 HTMLTestRunner 模块 (需自己手动导入至 )
import HTMLTestRunner
if __name__ ==\'__main__\':
suite = unittest.TestSuite()#定义一个测试套件
# suite.addTest(TestCalc(\'test_pass_case\'))
# suite.addTest(TestCalc(\'test_a\'))
# suite.addTest(TestCalc(\'test_fail_case\')) #单个添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
f = open(\'report.html\',\'wb\')#打开一个测试报告的文件
runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=\'test_report\',
description=\'描述\')
runner.run(suite) #运行
b,安装 BeautifulReport 模块 ,较HTMLTsetRunner 模块生成的测试报告更直观,漂亮(同样需要自己手动导入)
from BeautifulReport import BeautifulReport
if __name__ ==\'__main__\':
suite = unittest.TestSuite()#定义一个测试套件
# suite.addTest(TestCalc(\'test_pass_case\'))
# suite.addTest(TestCalc(\'test_a\'))
# suite.addTest(TestCalc(\'test_fail_case\')) #单个添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
# f = open(\'report.html\',\'wb\')#打开一个测试报告的文件
# runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=\'test_report\',
# description=\'描述\')
# runner.run(suite) #运行
result = BeautifulReport(suite)
result.report(filename=\'testreport\', description=\'描述\', log_path=\'.\')
五,输出xml 格式的测试报告,供后续jenkins 使用
pip install xmlrunner 命令安装 xmlrunner 模块
import xmlrunner
if __name__ ==\'__main__\':
suite = unittest.TestSuite()#定义一个测试套件
# suite.addTest(TestCalc(\'test_pass_case\'))
# suite.addTest(TestCalc(\'test_a\'))
# suite.addTest(TestCalc(\'test_fail_case\')) #单个添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
runner = xmlrunner.XMLTestRunner(output=\'report\') # 指定报告放的目录
runner.run(suite)
输出结果:可以看到在report目录下已经产生了xml格式的报告了,而且还自动把日期加上了
以上是关于Python 单元测试的主要内容,如果未能解决你的问题,请参考以下文章