单元测试框架 unittest 基础核心内容,快速上手!


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的基础内容和常用方法,不是很全,后续边学习边补充;

欢迎各位大佬们指点~

猜你喜欢

转载自blog.csdn.net/weixin_46761622/article/details/128792928