本文共 6738 字,大约阅读时间需要 22 分钟。
目录
1.单元测试:对于软件设计最小的单元进行正确性测试,将可能存在的错误在最小范围内解决。
2.目的:发现模块内部逻辑,语法,算法,功能等错误。 3.测试方式:代码级别的测试和模块功能的测试 3.1代码级别测试 根据内部逻辑与接口编写测试用例 接口测试:确保接口实现正确,符合设计文档规范 数据结构测试:确保数据接口可用,例如数据库,文件,自定义数据结构; 边界测试:对于边界进行测试基础测试用例
def add(*args): result = 0 for i in args: result +=i return resultprint(add(1))print(add(1,2))print(add(1,"a"))...13Traceback (most recent call last): File "C:\Users\shitou\eclipse-workspace\python_test\src\test\__init__.py", line 9, inprint(add(1,"a")) File "C:\Users\shitou\eclipse-workspace\python_test\src\test\__init__.py", line 4, in add result +=iTypeError: unsupported operand type(s) for +=: 'int' and 'str'
1.测试用例:
1).测试环境准备 2).测试代码执行 3).测试环境还原 4).测试回归化 5).测试结果分析2.测试用例结构
import unittestclass MyTest(unittest.TestCase): @classmethod def setUpClass(cls): #初始化测试:构建预置条件,套件执行一次 def setUp(self): #初始化:构建预置条件,每个脚本执行一次 def tearDown(self): #恢复测试环境:清理测试数据等,每个脚本执行一次 @classmethod def tearDownClass(cls): #恢复测试环境:清理测试数据等,套件执行一次 def test_xxx(self): #测试用例必须以test开头 if __name__=="__main__": unittest.main()#执行测试用例
3.实例测试
1)待测方法def add(a,b): return a+b
2)测试用例
import unittestfrom test import myfunction as MFclass MyTest(unittest.TestCase): def setUp(self): print("test start") def tearDown(self): print("end test") def test_001(self): result = MF.add(1, 2) self.assertEqual(result, 3) def test_002(self): result = MF.add(0, 2) self.assertEqual(result, 2) def test_003(self): self.assertRaises(TypeError, MF.add(0, 2)) if __name__=="__main__": unittest.main()
import unittestfrom test import myfunction as MFclass MyTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def test_001(self): result = MF.add(1, 2) self.assertEqual(result, 3) def test_002(self): result = MF.add(0, 2) self.assertEqual(result, 2) def test_003(self): self.assertRaises(TypeError, MF.add(0, 2)) if __name__=="__main__": suite = unittest.TestSuite() #添加单个测试用例 suite.addTest(MyTest("test_001")) suite.addTest(MyTest("test_002")) #添加多个测试用例 test_cases = [MyTest("test_003")] suite.addTests(test_cases) #统计测试用例数 tc_num = suite.countTestCases() print(tc_num) #3 runner = unittest.TextTestRunner(verbosity=0) runner.run(suite) #执行#0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功803----------------------------------------------------------------------Ran 3 tests in 0.000sOK#1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”3.F.#2 (详细模式):测试结果会显示每个测试用例的所有相关的信息并且 你在命令行里加入不同的参数可以起到一样的效果3test_001 (__main__.MyTest) ... oktest_002 (__main__.MyTest) ... oktest_003 (__main__.MyTest) ... ok----------------------------------------------------------------------Ran 3 tests in 0.000sOK
result = MF.add(1, 2) self.assertEqual(result, 4,"预期是%d,实际是%d") self.assertTrue(expr, msg) ...
1.使用装饰器unittest.skip
import unittestfrom test import myfunction as MFclass MyTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def test_001(self): result = MF.add(1, 2) self.assertEqual(result, 3,"预期是%d,实际是%d") @unittest.skip("Not Test") def test_002(self): print("no test") result = MF.add(0, 2) self.assertEqual(result, 3)# # def test_003(self):# self.assertRaises(TypeError, MF.add(0, 2))# if __name__=="__main__": unittest.main()# .# ----------------------------------------------------------------------# Ran 2 tests in 0.000s# # OK (skipped=1)
2.skipIf
测试方法version = 1def add(a,b): return a+b
测试用例
import unittestfrom test import myfunction as MFclass MyTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def test_001(self): result = MF.add(1, 2) self.assertEqual(result, 3,"预期是%d,实际是%d") @unittest.skipIf(MF.version==1, "跳过测试") #满足条件则不执行 def test_002(self): result = MF.add(0, 2) self.assertEqual(result, 3).----------------------------------------------------------------------Ran 2 tests in 0.000sOK (skipped=1)if __name__=="__main__": unittest.main()
3.skipUnless
import unittestfrom test import myfunction as MFclass MyTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def test_001(self): result = MF.add(1, 2) self.assertEqual(result, 3,"预期是%d,实际是%d") @unittest.skipIf(MF.version==1, "跳过测试") #满足条件则跳过 def test_002(self): result = MF.add(0, 2) self.assertEqual(result, 3) @unittest.skipUnless(MF.version==1, "跳过测试") #不满足条件则跳过 def test_003(self): result = MF.add(0, 3) self.assertEqual(result, 3)if __name__=="__main__": unittest.main()
4.expectedFailure
import unittestfrom test import myfunction as MFclass MyTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def test_001(self): result = MF.add(1, 2) self.assertEqual(result, 3,"预期是%d,实际是%d") @unittest.expectedFailure def test_002(self): result = MF.add(0, 2) self.assertEqual(result, 3) if __name__=="__main__": unittest.main()
unittest.defaultTestLoader.discover
def set_test_suite(self): """ set case suite :return: """ #定义测试套件 #定义测试文件查找的目录 test_suite = unittest.TestSuite() testcase_dir = os.path.join(RC.proDir,"testcase") discover = unittest.defaultTestLoader.discover(testcase_dir, pattern = 'TS*.py', top_level_dir=None) #扫描所有TS开头的py文件,然后把测试用例添加到测试集合 if discover: for suite in discover: for test_case in suite: test_suite.addTest(test_case) else: return None return test_suite
def runAllTest(self): """ run test :return: """ try: suite = self.set_test_suite() if suite: logger.info("********TEST START********") fp = open(reportPath, 'wb') runner = HT.HTMLTestRunner(stream=fp, verbosity=2, title='Test Report', description='Test Description') runner.run(suite) fp.close() time.sleep(3) else: logger.info("Have no case to test.") except Exception as ex:
1.unittest.main()执行过程
收集测试用例 根据case生成测试集 运行测试用例转载地址:http://vtmji.baihongyu.com/