unittest自动化测试框架
1.单元测试框架Unittest简介
单元测试:指的是在软件开发当中,对程序的最小单元(函数,方法)进行测试的过程。 unittest不仅可以用于单元测试,还可以用于自动化测试用例的开发和执行。组织执行自动 化测试用例。并且提供一些丰富的断言方法,判断用例是否通过,最终能够生成测试报告。
2.基本使用
2.1 基于Python的单元测试框架有哪些
框架名称 | unittest | pytest |
---|
难易程度 | 更简单,容易上手 | 市场份额会更多 | 使用规则 | 1.新建一个类,必须继承unittest.TestCase(耦合) 2.导入unitttest模块。Alt+Enter 3.测试用例必须以test_开头。 | 1.测试文件必须test_开头或者_test结尾。(非耦合) 2.测试类名必须Test开头 3.测试用例必须以test_开头 | 夹具的差异 | setUp/tearDown 在每个用例的前后执行 setUpClass/tearDownClass 在每个类的前后执行。 | setup/teardown 在每个用例的前后执行 setup_class/teardown_class 在每个类的前后执行。 | 断言的差异 | self.assertEqual() | python原生的assert | 失败用例重跑差异 | 没有 | 支持 | 参数化差异 | ddt | @pytest.mark.parametrize() |
2.2 单元测试框架的作用
1.找到测试用例。根据他们的默认的测试用例的规则。(原理,底层。BAT。)
2.执行测试用例。
3.判断测试用例的结果。
4.生成测试报告。
2.3 unittest重要组件
TestCase测试用例:
TestSuite测试套件: 整理测试用例,形成一个集合。
TestLoader测试加载器: 加载测试用例套件或者测试用例。
TestFixtrue测试固件
TestRunner测试运行器:运行测试用例。
2.4 unittest如何运行测试用例
unittest的运行方式有两种:
**1.命令行的运行方式。(unittest默认的执行方式) **
python -m unittest test_api.py
python -m unittest test_api.TestApi
python -m unittest test_api.TestApi.test_baili
python -m unittest -v test_api.py
python -m unittest -v test_api.py -k *_baili
python -m的意思就是以命令行的方式运行测试用例。
unitttest -v 表示以啰嗦的方式,详细的方式展示测试结果。
-k表示通过通配符匹配的方式去查找测试用例。
2.main方式运行
if __name__ == '__main__':
print("-----------wwwww--------------")
unittest.main()
2.5 unittest的运行结果
字符 | 含义 |
---|
. | 代表成功。如果加了-v,那么.会变成OK | F | 代表用例执行失败 | E | 出错 有异常抛出 | S | 代表用例被跳过 |
2.6 unittest测试用例的执行顺序
ord() python的内置函数,作用是返回ASCII码。 根据ASCII的大小排序来执行测试用例。
2.7 多种unittest的加载方式和运行测试用例的方式
1.通过TestSuite加载多个测试用例的方式执行。
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(TestApi('test_01_mashang'))
suite.addTest(TestApi('test_02_baili'))
suite.addTest(TestWeb('test_01_login'))
unittest.main(defaultTest='suite')
if __name__ == '__main__':
suite = unittest.TestSuite()
testcases = [TestApi('test_01_mashang'),TestApi('test_02_baili'),TestWeb('test_01_login')]
suite.addTests(testcases)
unittest.main(defaultTest='suite')
2.加载一个目录下所有的测试用例
if __name__ == '__main__':
suite = unittest.defaultTestLoader.discover("./testcases", pattern='test _*.py')
unittest.main(defaultTest='suite')
九、为什么我们使用unittest.main()就可以执行所有的测试用例?
名称 | 用法 |
---|
TestCase | 测试用例 | TestSuite | 测试套件:整理测试用例,形成一个集合。 | TestLoader | 测试加载器:加载测试用例套件或者测试用例。 | TestFixtrue | 测试固件 | TestRunner | 测试运行器:运行测试用例。 |
如何工作.,底层原理如何实现。
类() 实例化一个对象,自动调用init方法。
module:测试用例所在的路径,__main__代表当前模块。
defaultTest:默认的待测试的测试用例或者测试套件的名称。
argv:接收外部传递给程序的参数testRunner:测试运行器
testLoader:测试加载器
exit:是否在测试用例结束之后退出程序
verbosity:显示详细信息的程度。
<0 只显示用例总数以及全局执行结果
1 默认值,显示用例总数以及全局执行结果外,还显示一个标记:
. F E,S
>=2 显示用例总数以及全局执行结果外,显示详解结果
(1)测试加载器已经初始化
1 def init(self, module=‘main’, defaultTest=None, argv=None,
2 testRunner=None, testLoader=loader.defaultTestLoader,
3 exit=True, verbosity=1, failfast=None, catchbreak=None,
4 buffer=None, warnings=None, *, tb_locals=False):
(2) 通过测试加载器加载测试用例保存到self.test
1 def createTests(self, from_discovery=False, Loader=None):
2 if self.testNamePatterns:
3 self.testLoader.testNamePatterns = self.testNamePatterns
4 if from_discovery:
5 loader = self.testLoader if Loader is None else Loader()
6 self.test = loader.discover(self.start, self.pattern, self.top)
7 elif self.testNames is None:
8 self.test = self.testLoader.loadTestsFromModule(self.module)
9 else:
10 self.test = self.testLoader.loadTestsFromNames(self.testNames,
11 self.module)
(3) 创建文本测试运行器
1 if self.testRunner is None:
2 self.testRunner = runner.TextTestRunner
最后通过:self.result = testRunner.run(self.test)执行已经加载好的测试用
例。并且把结果放到self.result
2.9unittest夹具
setUp/tearDown 在每个用例的前后执行setUpClass/tearDownClass 在每个类的前后执行。
setUpModule/tearDownModule 在每个模块的前后执行
import unittest
class TestApi(unittest.TestCase):
def setUp(self) -> None:
print("在每一个测试用例之前执行:打开浏览器,加载网页")
def tearDown(self) -> None:
print("在每一个测试用例之后执行:关闭浏览器")
@classmethod
def setUpClass(cls) -> None:
print("‐‐‐‐‐‐在每个类之前执行:初始化日志对象,创建数据库连接‐‐‐‐‐‐‐‐")
@classmethod
def tearDownClass(cls) -> None:
print("‐‐‐‐‐‐在每个类之后执行:销毁日志对象,销毁数据库连接‐‐‐‐‐‐‐‐")
def test_01_mashang(self):
print("码尚教育软件测试")
def test_02_baili(self):
print("码尚百里")
def test_03_weiwei(self):
print("码尚微微")
def test_04_qingtian(self):
print("码尚晴天")
|