目录
unittest定义
python自带的单元测试框架
unittest 使用
- 导包,import unittest
- 创建测试类,继承unittest.TestCase
- 创建1条或多条用例,需要以test开头
- unittest.main() —unittest自带的执行测试用例的方法
- 输入python 文件名.py,执行
# 比较两个数字大小
import unittest
class TestCase01(unittest.TestCase):
def test_01(self):
self.assertEqual(1,1,"两个数是否相等")
def test_02(self):
self.assertEqual(1,2,"两个数是否相等")
unittest.main()
TestSuite 测试套件
使用测试套件,将不同的测试用例加载到测试套件中,然后通过运行测试套件实现运行不同模块的测试用例
import unittest
from test01 import TestCase01
suite = unittest.TestSuite()
# 方法1
suite.addTest(TestCase01("test_01"))
# 方法2(推荐)
case = unittest.defaultTestLoader.discover(start_dir='.',pattern='test*.py')
suite.addTest(case)
start_dir : 测试用例文件所在位置
pattern : 规则 — 以 test 开头的 py 文件
unittest.main()不可以写到测试套件中,避免重复执行,结果发生冲突
如果需要单独运行当前模块测试用例,可利用python的main方法
import unittest
if __name__ == "__main__":
unittest.main()
运行测试套件,生成测试报告
unittest自带的报告是文本格式,可读性不好
import unittest
with open ('测试报告.txt','a',encoding='utf-8') as f:
runner = unittest.TextTestRunner(stream=f)
一般使用第三方模块 HTMLTestRunner 生成报告
import unittest
from HTMLTestRunner import HTMLTestRunner
with open ('report.html','w') as f:
runner = HTMLTestRunner(stream=f, verbosity=2, title='测试', description=None, tester='yyy')
runner.run('测试套件suite')
stream : 测试报告路径
verbosity : 报告详细程度
- 1(默认),成功输出 . ,失败输出 F,错误输出 E
- 2,打印详细的返回信息
- 0,不输出信息
title : 测试报告标题
description : 测试报告描述
tester : 测试人
常用断言及装饰器
装饰器
- @unittest.skip(“这个用例不执行”)
- @unittest.skipIf(条件,“条件为真该用例不执行”)
- @unittest.skipUnless(1 != 1,“条件为假该用例不执行”)
import unittest
class TestDemo(unittest.TestCase):
@unittest.skip("直接跳过")
def test_01(self):
self.assertEquals(1,1)
@unittest.skipIf(1 == 1,"条件为真该用例不执行")
def test_02(self):
self.assertEquals(1,1)
@unittest.skipUnless(False,"条件为false该用例不执行")
def test_03(self):
self.assertEquals(1,1)
常用断言
- assertEquals(first, second, msg=None)
- assertNotEquals(first, second, msg=None)
- assertIn(member, container, msg=None)
- assertNotIn(member, container, msg=None)
- assertIs(expr1, expr2, msg=None)
- assertIsNot(expr1, expr2, msg=None)
- assertAlmostEqual(first, second, places=None, msg=None,delta=None)
- first 比较的第一个值
- second 比较的第二个值
- places 比较小数点前几位,默认7位
- msg 信息
- delta 第一个值和第二个值的差值<=delta,不可以和palces同时出现。
import unittest
class TestDemo1(unittest.TestCase):
def test_02(self):
self.assertEqual(1, 1, "判断1和1是否相等")
def test_03(self):
self.assertIn("1", "123", "判断后者是否包含前者")
self.assertNotIn("1", "123", "判断后者是否不包含前者")
def test_04(self):
self.assertIs("1", "1", "判断两个是否属于同一对象")
self.assertIsNot("1", "aaaa", "判断两个是否不属于同一对象")
def test_05(self):
self.assertAlmostEqual(1.1234,1.12344,2,"判断两个值的前两位小数是否相等")
self.assertAlmostEqual(1.1234,1.12344,msg = "判断两个值的差值是否<=delta", delta=1)
测试夹具 Fixture
可以让我们把测试运行前和运行后的代码抽离出来,方便代码维护,减少冗余;
测试模块夹具
需要写到class外面(类似定义全局变量)
-
setupModule
每个测试模块运行前运行
-
teardownModule
每个测试模块运行结束后运行
def setupModule():
pass
def teardownModule():
pass
class ...
测试类夹具
-
setupClass
每个测试类运行前运行
-
teardownClass
每个测试类运行结束后运行
import unittest
class TestDemo(unittest.TestCase)
@classmethod
def setupClass(cls):
pass
@classmethod
def teardownClass(cls):
pass
测试用例夹具
-
setup
测试用例开始前运行,可用于用例的前置条件,或者连接数据库等操作
-
teardown
测试用例结束后运行,可用于关闭数据库,或者清理测试环境的部分代码
import unittest
class TestDemo(unittest.TestCase)
def setup(self):
pass
def teardown(self):
pass
总结
以上就是我在学习 unittest 单元测试框架中的小小总结,本文仅仅简单介绍了unittest的基础内容和常用方法,不是很全,后续边学习边补充;
欢迎各位大佬们指点~