04-03 unitest--框架重要概念
测试开发 unittest 测试框架
框架的结构
unittest的入门学习
-----作者 老男孩教育 Robert讲师
前言
前面我们已经通过对unittest有过安装和运行,在脑海里对这个unittest的面目有个真实的印象。
知道它对于一个有python解释器的设备来说,是默认存在的,根本无需额外的安装步骤。
它的运行也是极其简单,一行命令就可以运行或者在ide里面也是一键就可以运行。
那么今天我们要更加深入的来了解它的内部机制,也就是unittest框架的基本概念。
概念一: 测试脚手架
专门的库fixtures()
运行用例需要的前提准备工作,还有 运行完成的清理工作。通过这个可以避免
例如: 对一个测试用例执行环境时需要的文件创建和销毁,
通常会有setUp,tearDown默认的函数。
import unittest
class MyTestClass(unittest.TestCase):
def setUp(self) -> None:
with open(file="tmp.txt" ,mode='w',encoding='utf-8') as fw:
fw.write("OK")
def tearDown(self) -> None:
# with open(file="tmp.txt", mode='w') as fw:
# fw.write("")
pass
def test_day03(self):
with open(file="tmp.txt" ,mode='r') as fw:
fc =fw.read()
print(fc)
self.assertEqual(fc.strip(),"OK")
# 用pycharm IDE运行结果如下
Ran 1 test in 0.003s
OK
Process finished with exit code 0
概念二: 测试用例
关键字: TestCase
最小单元,测试用例。无需多解释。
def test_dat04(self):
self.assertEqual(1000,int("1000"))
概念三: 测试套件
关键字: TestSuite
用法: unittest.TestSuite() 类
多个子用例组合起来就是一个套件。可以理解成用例组合,理解成TestCases。
下面例子中就有测试套件。
# 定义一个测试套件
def daysuite():
tmp_suite =unittest.TestSuite()
tmp_suite.addTests(MyTestClass.test_day03(),MyTestClass.test_dat04())
return tmp_suite
概念四: 测试运行器
关键字: TestTestRunner
执行测试用例和输出测试结果的组件。
用法: unittest.TextTestRunner()类
ruunner = unittest.TextTestRunner()
ruunner.run(daysuite())
综合案例:
import unittest
class MyTestClass(unittest.TestCase):
def setUp(self) -> None:
with open(file="tmp.txt" ,mode='w',encoding='utf-8') as fw:
fw.write("OK")
def tearDown(self) -> None:
with open(file="tmp.txt", mode='w') as fw:
fw.write("")
def test_day03(self):
with open(file="tmp.txt" ,mode='r') as fw:
fc =fw.read()
print(fc)
self.assertEqual(fc.strip(),"OK")
def test_dat04(self):
self.assertEqual(1000,int("1000"))
def daysuite():
tmp_suite =unittest.TestSuite()
tmp_suite.addTests(MyTestClass.test_day03(),MyTestClass.test_dat04())
return tmp_suite
if __name__=="__main__":
ruunner = unittest.TextTestRunner()
ruunner.run(daysuite())
# 用法:
def daysuite():
tmp_suite =unittest.TestSuite()
tmp_suite.addTests(MyTestClass.test_day03(),MyTestClass.test_dat04())
return tmp_suite
if __name__=="__main__":
ruunner = unittest.TextTestRunner()
ruunner.run(daysuite())
test runner 是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。
执行结果如下:
(testops) C:\Users\Robert\PycharmProjects\testops>python -m unittest Stage5\06unittest\day04.py
.OK
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
额外的unittest概念
概念五: 测试装载
TestLoder:
关键字: TestLoder
用法一: unittest.TestLoader.loadTestsFromTestCase("MyTestClass")
作用: 把单个或多个测试用例加载到测试套件中。
def daysuite():
tmp_suite =unittest.TestSuite()
tmp_suite = unittest.TestLoader.loadTestsFromTestCase("MyTestClass")
return tmp_suite
unittest 源代码查看& 分析:
dir(unittest.TestLoader)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_find_test_path', '_find_tests', '_get_directory_containing_module', '_get_module_from_name', '_get_name_from_path', '_match_path', '_top_level_dir', 'discover', 'getTestCaseNames', 'loadTestsFromModule', 'loadTestsFromName', 'loadTestsFromNames', 'loadTestsFromTestCase', 'sortTestMethodsUsing', 'suiteClass', 'testMethodPrefix', 'testNamePatterns']
由此我们可以知道 加载测试用例的方法有 5+
概念六: 测试结果 (不要求掌握)
关键字: TextTestRusult
用法: 有歧义的东西
在测试结果中增加成果/失败,跳过等等操作。
结合httptestRunner来运行最好理解。这里不多少。
小结:
- 导入unittest模块
- 类名的第一个字母大写;
- 类要继承unittest.TestCase;
- 测试函数前必须加test,否则不会被当作测试用例来执行;
- setUp()和tearDown()方法每个测试用例都会执行;