博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unittest 单元测试
阅读量:5010 次
发布时间:2019-06-12

本文共 3717 字,大约阅读时间需要 12 分钟。

Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。

在说unittest之前,先说几个概念:

  • TestCase 也就是测试用例
  • TestSuite 多个测试用例集合在一起,就是TestSuite
  • TestLoader是用来加载TestCase到TestSuite中的
  • TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

1. unittest的用法

下面写一个简单的单元测试用例:

1 import unittest2 def calc(a,b):3     return round(a/b,1)4 class TestCalc(unittest.TestCase):5     def test1(self):  #测试用例 16         res = calc(1,2)7         self.assertEqual(0.5,res,'计算不正确')  #预计结果与返回res比较,'计数不正确',不是必须的8 9 unittest.main()  #仅用于查看结果,不能产生报告

注意:

1. 运行时,不要选择Run 'Unittests for ...'这是通过pycharm自带的运行方式,不会产生测试报告的。

2. 要点击菜单栏中的run...(alt + shift + F10) ,选当前py文件,以一个python文件来运行,或者在 Terminal 中运行

3. 在测试用例里面,函数名必须以test开头,否则不会被执行的。类名无所谓。

下面是一些常用的断言,也就是校验结果

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

为用例添加前置条件和用例的执行顺序

1 import unittest 2 class TestCalc(unittest.TestCase): 3     def setUp(self): 4         print('这是setup') 5     def tearDown(self): 6         print('这是teardown') 7     @classmethod 8     def tearDownClass(cls): 9         print('这是tearDownClass')10     @classmethod11     def setUpClass(cls):12             print('这是setUpClass')13     def testa(self):14         print('这是用例testa')15     def testb(self):16         print('这是用例testb')17 18 if __name__ == '__main__':19     unittest.main()

运行结果:

这是setUpClass这是setup这是用例testa这是teardown这是setup这是用例testb这是teardown这是tearDownClass..----------------------------------------------------------------------Ran 2 tests in 0.000sOK

总结:

  • 在每一个测试用例前后执行def setup(self),def tearDown(self)
  • 在所有用例运行前后执行def setUpClass(cls),def tearDownClass(cls)
  • 用例执行顺序:按首字母排序的

2. 生成测试报告

1) HTMLTestRunner 生成报告

那如何生成一个测试报告呢,需要加入另外一个模块:HTMLTestRunner。

下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

下载HTMLTestRunner.py,放到python安装目录的lib下,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果,代码如下:

1 import unittest,HTMLTestRunner 2 def calc(a,b): 3     return round(a/b,1) 4 class TestCalc(unittest.TestCase): 5     def test1(self): 6         '''用例描述:计算a/b的正确性''' 7         res = calc(1,2) 8         self.assertEqual(0.5,res,'计算不正确') 9     def test2(self):10         '''用例描述:除数不能为0'''11         res = calc(1,0)12         self.assertIsNone(res)    #判断是不是None,如果是None就通过13 14 suite = unittest.TestSuite()    #定义了一个测试集合15 suite.addTest(unittest.makeSuite(TestCalc)) #把刚才写的用例加到测试集合,addTests用于py文件,addTest用于类16 f = open('test.html','wb')17 runner = HTMLTestRunner.HTMLTestRunner(f,title='测试用例标题',description='测试用例描述')18 runner.run(suite)    #运行用例

生成的 test.html 测试报告如下所示:

 2) BeautifulReport 生成报告

手动安装BeautifulReport

下载地址:https://coding.net/u/pengzhuopeng/p/PythonLearner/git/tree/master/%E5%B7%A5%E5%85%B7?public=true

切换到BeautifulReport目录下,执行:python setup.py install

1 import unittest 2 from BeautifulReport import BeautifulReport as bf 3 def calc(a,b): 4     return round(a/b,1) 5 class TestCalc(unittest.TestCase): 6     def test1(self): 7         '''用例描述:计算a/b的正确性''' 8         res = calc(1,2) 9         self.assertEqual(0.5,res,'计算不正确')10     def test2(self):11         '''用例描述:除数不能为0'''12         res = calc(1,0)13         self.assertIsNone(res)    #判断是不是None,如果是None就通过14 15 suite = unittest.TestSuite()    #定义了一个测试集合16 suite.addTest(unittest.makeSuite(TestCalc)) #把刚才写的用例加到测试集合,addTests用于py文件,addTest用于类17 report = bf(suite)18 report.report(filename='test1',description='必填参数,描述',log_path='.')19 #log_path、filename不是必填,filename不填默认生成文件名为“report.html”,log_path默认当前路径,log_path='.'表当前路径

 生成的 test1.html 报告如下图所示

 

转载于:https://www.cnblogs.com/pengzhuopeng/p/9128677.html

你可能感兴趣的文章
【以太坊钱包开发 一】MyEtherWallet 钱包开发项目概述
查看>>
golang——(strings包)常用字符串操作函数
查看>>
发布aar到jcenter
查看>>
跨浏览器问题的五种解决方案
查看>>
XPath定位时,使用文本的方法小技巧。
查看>>
数学计算公式
查看>>
Hibernate学习(二补充)关系映射----基于外键的双向一对一
查看>>
开发记录04
查看>>
安装pandas报错(AttributeError: 'module' object has no attribute 'main')
查看>>
ch02 fundamental definition 01
查看>>
JSON解析
查看>>
Position is everything?(css定位学习的一些心得)(一)
查看>>
如何提高编程水平
查看>>
Jquery Uploadify3.21.与2.1版本 使用中存在的问题--记录三
查看>>
Linux查看进程的内存占用情况 分类: ubuntu ...
查看>>
[BZOJ 2818]Gcd
查看>>
FORM值传递与地址传递
查看>>
(译)yaml快速教程
查看>>
C:大数相加
查看>>
静态博客教程 1:hexo + github
查看>>