单元测试框架的优势:
- 用例规范,组织明了,方便后续维护
- 提供多种比较方法
- 日志清晰,能够快速定位bug
四个概念:
- test case:测试用例,即一个包括setUp--run--tearDown的测试流程
- test suite:测试套件,可以执行一个或多个测试用例
- test runner:执行用例,测试结果保存到TextTeestResult实例中
- test fixture:对一个测试用例环境的搭建和销毁,通过setUp和tearDown视线
在count.py文件中定义Count类
#coding=utf-8 class Count: """docstring for Count""" def __init__(self,a,b): #初始化参数 self.a=a self.b=b def add(self): return self.a+self.b
un_test.py文件
#coding=utf-8 from count import Count import unittest class TestCount(unittest.TestCase): """docstring for TestCount""" def setUp(self): #测试开始前的前置性工作 self.c = Count(4,6) def test_count(self): #测试案例必须以test开头 self.add = self.c.add() self.assertEqual(self.add,10) def tearDown(self): #完成测试后的后置工作 pass if __name__ == '__main__': unittest.main() #main方法默认执行所有的用例
将assertEqual(self.add,10)改为assertEqual(self.add,8),再执行一次,则有详细的报错信息
main()方法中封装了TestSuite()和TextTestRunner(),注释掉main()方法后如下:
#unittest.main() #构造测试集 suite = unittest.TestSuite() suite.addTest(TestCount('test_count')) #addTest装载测试用例,只执行装载的用例 #执行测试 runner = unittest.TextTestRunner() runner.run(suite)
unittest中提供的比较方法:
discover更多测试用例
太多用例写在一个文件中不便于后续的维护工作,discover方法后续添加 un_*.py 文件时,不需要对 alltest.py 文件进行修改
如果discover中运行的文件涉及到多层级目录,需要在每个目录中添加__init__.py文件
#alltest.py #coding=utf-8 import unittest def creatsuite(): testunit = unittest.TestSuite() test_address = 'C:\\Users\\user\\Desktop\\python_study\\script' #测试脚本所在目录 #定义discover方法的参数 discover = unittest.defaultTestLoader.discover(test_address,pattern='un_*.py',top_level_dir=None) for test_suite in discover: for test_case in test_suite: testunit.addTests(test_case) return testunit if __name__ == '__main__': runner = unittest.TextTestRunner() runner.run(creatsuite())
两个测试类文件un_test.py un_test2.py
#un_test.py #coding=utf-8 from count import Count import prime import unittest class TestCount(unittest.TestCase): """docstring for TestCount""" def setUp(self): self.c = Count(4,6) def test_count(self): self.add = self.c.add() self.assertEqual(self.add,10) def test_prime(self): self.pr = prime.is_Prime(3) self.assertTrue(self.pr,msg='is not prime') def tearDown(self): pass
#un_test2.py #coding=utf-8 from count import Count import prime import unittest class TestCount2(unittest.TestCase): """docstring for TestCount""" def setUp(self): self.c = Count(4,6) def test_count2(self): self.add = self.c.add() self.assertEqual(self.add,10) def test_prime2(self): self.pr = prime.is_Prime(3) self.assertTrue(self.pr,msg='is not prime') def tearDown(self): pass
对于目录、文件、用例来说,默认根据ASCII码顺序执行:0~9,A~Z,a~z
如果对用例执行有顺序要求,可以通过调整目录、文件、用例的名称或者用 TestSuite 类的 addTest() 方法按照一定的顺序来加载