经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
Unittest框架小结
来源:cnblogs  作者:Secret608  时间:2018/10/18 8:44:31  对本文有异议

  在日常的自动化测试过程中,Python里有一个自带的单元测试框架是unittest模块,简单易用,这里简单介绍下其主要的用法。

  Unittest测试框架主要包含四个部分

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

  这里盗一波图来图文并茂的介绍一波框架运作流程:

  

 来一发实例。压压惊~

第一步:编写测试用例:

  1. # -*- coding: utf-8 -*-
  2. #先设置编码,utf-8可支持中英文,如上,一般放在第一行
  3. #注释:包括记录创建时间,创建人,项目名称。
  4. '''
  5. Created on 2018-10-12xxxx
  6. __author__ = 'xxxx'
  7. Project:使用unittest框架编写测试用例
  8. '''
  9. import unittest
  10. #定义测试类,父类为unittest.TestCase。
  11. #可继承unittest.TestCase的方法,如setUp和tearDown方法,不过此方法可以在子类重写,覆盖父类方法。
  12. #可继承unittest.TestCase的各种断言方法。
  13. from mathFunc import *
  14. class TestMathFunc(unittest.TestCase):
  15. """Test mathfuc.py"""
  16. #定义setUp()方法用于测试用例执行前的初始化工作。
  17. #注意,所有类中方法的入参为self,定义方法的变量也要“self.变量”
  18. #针对每个测试用例的初始化及结尾工作
  19. @classmethod
  20. def setUpClass(cls):
  21. print "This setUpClass() method only called once."
  22. #定义tearDown()方法用于测试用例执行之后的善后工作
  23. @classmethod
  24. def tearDownClass(cls):
  25. print "This tearDownClass() method only called once too."
  26. # def setUp(self):
  27. # def tearDown(self):
  28. #定义测试用例,以“test_”开头命名的方法
  29. #注意,方法的入参为self
  30. #可使用unittest.TestCase类下面的各种断言方法用于对测试结果的判断
  31. #可定义多个测试用例
  32. def test_add(self):
  33. """Test method add(a, b)"""
  34. print "add"
  35. self.assertEqual(3, add(1, 2))
  36. self.assertNotEqual(3, add(2, 2))
  37. def test_minus(self):
  38. """Test method minus(a, b)"""
  39. print "minus"
  40. self.assertEqual(1, minus(3, 2))
  41. @unittest.skip("I don't want to run this case.") #装饰器,表明不再执行下个模块
  42. def test_multi(self):
  43. """Test method multi(a, b)"""
  44. print "multi"
  45. self.assertEqual(6, multi(2, 3))
  46. def test_divide(self):
  47. """Test method divide(a, b)"""
  48. print "divide"
  49. self.assertEqual(2, divide(6, 3))
  50. self.assertEqual(2.5, divide(5, 2))
  51. #常用于测试脚本是否能够正常运行
  52. if __name__ == '__main__':
  53. #unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。
  54. #执行顺序是命名顺序:先执行test_case1,再执行test_case2,verbosity参数可以控制输出的错误报告的详细程度,默认1,0则不输出结果,2则输出详细结果
  55. unittest.main(verbosity=2)

第二步:组合测试用例:

  1. # -*- coding: utf-8 -*-
  2. import unittest
  3. from test_mathfunc import TestMathFunc
  4. if __name__ == '__main__':
      
  5. suite = unittest.TestSuite()
  6. tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")]
  7. suite.addTests(tests)
  8. runner = unittest.TextTestRunner(verbosity=2)
  9. runner.run(suite)
  10. #方式二:
  11. # 直接用addTest方法添加单个TestCase
  12.   suite.addTest(TestMathFunc("test_multi"))
  13. # 用addTests + TestLoader
  14. # loadTestsFromName(),传入'模块名.TestCase名'
  15.   suite.addTests(unittest.TestLoader().loadTestsFromName('test_mathfunc.TestMathFunc'))
  16.   suite.addTests(unittest.TestLoader().loadTestsFromNames(['test_mathfunc.TestMathFunc'])) # loadTestsFromNames(),类似,传入列表
  17. # loadTestsFromTestCase(),传入TestCase
  18.   suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMathFunc))

第三步:运行测试用例并保存报告:

  1. # -*- coding: utf-8 -*-
  2. import unittest
  3. from test_mathfunc import TestMathFunc
  4. if __name__ == '__main__':
  5. suite = unittest.TestSuite()
  6. suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMathFunc))
  7. #写入TXT
  8. with open('UnittestTextReport.txt', 'a') as f:
  9. runner = unittest.TextTestRunner(stream=f, verbosity=2)
  10. runner.run(suite)
  11. #写入HTML:
  12. with open('HTMLReport.html', 'w') as f:
  13. runner = HTMLTestRunner(stream=f,
  14. title='MathFunc Test Report',
  15. description='generated by HTMLTestRunner.',
  16. verbosity=2
  17. )
  18. runner.run(suite)

最后,总结一波:

  1. unittest是Python自带的单元测试框架,我们可以用其来作为我们自动化测试框架的用例组织执行框架。
  2. unittest的流程:写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。
  3. 一个class继承unittest.TestCase即是一个TestCase,其中以 test 开头的方法在load时被加载为一个真正的TestCase。
  4. verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。
  5. 可以通过addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。
  6. 用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境
  7. 我们可以通过skip,skipIf,skipUnless装饰器跳过某个case,或者用TestCase.skipTest方法。
  8. 参数中加stream,可以将报告输出到文件:可以用TextTestRunner输出txt报告,以及可以用HTMLTestRunner输出html报告。

 

参考文献:

https://blog.csdn.net/huilan_same/article/details/52944782

https://www.cnblogs.com/yufeihlf/p/5707929.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号