Unittest常用用法

  1. 基本概念

在开始运用unittest框架进行测试前,我们需要了解unittest框架中4个重要的概念:test fixture、test case、test suite、test runner。
test fixture:是初始化和清理测试数据及环境,通过覆盖TestCase的setUp()和tearDown()方法来实现
test case:是测试用例
test suite:是用例集合,即测试套件,通过addTest加载TestCase到TestSuite中,从而返回一个TestSuite实例。
test runner:的作用是运行用例并返回结果,通过TextTestRunner类提供的run()方法来执行test suite/test case。

  1. 基本用法

我们通过以下的“加法”例子学习unittest的基本用法:
首先建立一个加法类: calculator.py

计算器类class Count:

def __init__(self, a, b):
    self.a = int(a)
    self.b = int(b)

def add(self):
    return self.a + self.b

接着写test.py去测试“加法类:calculator.py”:

from testpro.calculator import Count
import unittest

class TestAdd(unittest.TestCase):
    def setUp(self):
        print('test start')

    def test_add(self):
        j = Count(2, 3)
        self.assertEqual(j.add(), 5, '计算错误!')

    def tearDown(self):
        print('test end')

if __name__ == '__main__':
    # 构造测试集
     suite = unittest.TestSuite()
     suite.addTest(TestAdd('test_add'))

     # 执行测试集合
     runner = unittest.TextTestRunner()
     runner.run(suite)

test.py 中,首先引入unittest模块,创建TestAdd类继承unittest的TestCase类。
setUp()方法用于测试用例执行前的初始化工作,而这里用来打印“test start”信息。
tearDown()方法与setUp()相对应,用于测试用例之后的工作,这里打印“test end”信息。
asserEqual()方法对add()的返回值进行断言,判断两者是否相等,assertEqual()方法由TestCase类继承而来。
TestSuite()类来创建测试套件,通过它提供的addTest()方法来添加测试用例test_add()。
TextTestRunner()类的run()方法来运行suite所组装的测试用例

  1. 执行用例的方法

有3种执行项目中测试用例的方法:
1、main() :unittest提供的全局方法,可以方便地将一个单元测试模块变成可以直接运行的测试脚本。 main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行它们。
2、run() :是unittest的TextTestRunner()类的方法,用来运行suite套件中的测试用例集。
3、discover() :TestLoader类中提供的方法,用来自动识别项目中的测试用例

from testpro.calculator import Count
import unittest

class TestAdd(unittest.TestCase):
    def setUp(self):
        print('test start')

    def test_add(self):
        j = Count(2, 3)
        self.assertEqual(j.add(), 5, '计算错误!')

    def tearDown(self):
        print('test end')

if __name__ == '__main__':
    # main()方法
     unittest.main()

     # run()方法
     #suite = unittest.TestSuite()
     # suite.addTest(TestAdd('test_add'))
     #runner = unittest.TextTestRunner()
     #runner.run(suite)

# discover方法
#test_dir = './test_case'
#discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
#if __name__ == '__main__':
#    runner = unittest.TextTestRunner()
#    runner.run(discover)
  1. 用例执行的顺序

1、unittest框架默认根据ASCII码的顺序加载测试用例的,数字与字母的顺序为:“0-9”,“A-Z”,“a-z”。而想要用例按顺序执行,需要通过TestSuite类的addTest()方法按照一定的顺序来加载。
2、通过前面对unittest单元测试框架的学习,我们来用它运行web自动化测试脚本。在开始之前,需要规划好测试目录,因为一旦测试用例多起来之后,后期维护就很麻烦。所以用例需要按照所测试的功能进行拆分,分散到不同的测试文件中。但通过addTest()添加/删除测试用例变得很麻烦,所以我们要用TestLoder类中提供的discover()方法解决:
discover(start_dir, pattern='test*.py, top_level_dir=None)
3、start_dir:要测试的模块名称或测试用例目录。
4、pattern=‘test.py’:表示用例文件名的匹配原则。以“test”开头的 ‘,py’类型的文件,星号“”表示任意多个字符。
5、top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None
让unittest框架查找到子目录中的测试文件,需要在每个子目录下放一个“_init_.py”文件,文件可以为空。

  1. 断言的方法

在执行用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果与预期结果是否相等决定的。unittest框架的TestCase类提供下面这些方法用于测试结果的判断。
常用的:
1、assertEqual(first, second, msg=None):断言第一个参数和第二个参数是否相等,如果不相等则测试失败。msg为可选参数,用于定义测试失败时想打印的信息。
2、assertTure(expr, msg=None):判断测试表达式是true或false
3、assertIN(first, second, msg=None):断言第一个参数是否在第二个参数中,反过来讲,第二个参数是否包含在第一个参数
在这里插入图片描述

  1. 跳过测试和预期失败

在运行测试时,有时需要直接跳过某些测试用例,或者当用例符合某个条件跳过测试,又或者直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器
1、unittest.skip(reason):无条件跳过测试的装饰器,说明跳过的原因
2、unittest.skipIf(condition, reason):如果条件为真,跳过测试的装饰器
3、unittest.skipUnless(condition, reason):跳过测试的装饰器,除非条件为真
4、unittest.expectedFailure():测试标记为失败。不管执行结果是否失败,统一标记失败。

<think>嗯,用户想了解unittest的使用方法,我得先理清楚该从哪些方面入手。首先,unittest是Python自带的单元测试框架,所以可能用户需要基础到中级的指导。用户可能是开发者,刚开始学习自动化测试,或者想巩固知识。得先介绍基本概念,比如测试用例、测试套件、断言方法这些。 然后,可能需要结构化的步骤,比如如何创建测试类,继承TestCase,写测试方法,还有常用的断言,比如assertEqual、assertTrue这些。用户可能想知道每个部分的作用,比如setUp和tearDown方法在初始化和清理资源时的应用。 接着,可能需要给出一个简单的例子,让用户能直观地看到代码结构。比如测试一个加法函数,先写被测函数,再写测试类,里面包含测试方法,用断言验证结果是否正确。这样用户能跟着例子自己动手试试。 另外,用户可能想知道如何运行测试,是用unittest.main()还是命令行执行。需要说明两种方法,可能还要提到测试发现的特征,比如文件名以test开头,或者使用discover命令来运行多个测试文件。 可能还需要覆盖一些高级用法,比如跳过测试、预期失败、测试套件的组合,或者与第三方库结合,比如用HTMLTestRunner生成报告。但用户的问题可能更偏向基础,所以先重点讲核心部分,高级内容可以简要提及,让用户知道有这些扩展功能。 还要注意用户可能遇到的常见问题,比如测试方法没有以test_开头导致未被执行,或者断言错误信息不清晰。这时候在示例中强调命名规则,以及使用msg参数增加断言描述会比较好。 最后,总结一下unittest的使用流程,强调测试的重要性,确保代码质量。可能用户需要的是一个清晰的步骤指南,配合代码示例,所以结构要分明,逻辑清晰,避免太过冗长,但关键点都要覆盖到。</think>好的,以下是一个关于 Python 标准库 `unittest` 的使用方法介绍,包含基础语法和示例: --- ### **1. 什么是 unittest?** `unittest` 是 Python 自带的单元测试框架,用于编写和运行自动化测试用例,确保代码的正确性。它的设计灵感来源于 Java 的 JUnit。 --- ### **2. 核心概念** - **TestCase**: 测试用例的最小单元,继承 `unittest.TestCase`。 - **TestSuite**: 多个测试用例的集合。 - **TestRunner**: 执行测试并输出结果。 - **断言方法**: 验证代码行为是否符合预期(如 `assertEqual`, `assertTrue` 等)。 - **Fixture**: 测试前置(`setUp`)和清理(`tearDown`)方法。 --- ### **3. 基础用法** #### **3.1 创建测试类** ```python import unittest # 被测函数示例 def add(a, b): return a + b # 测试类必须继承 unittest.TestCase class TestMathOperations(unittest.TestCase): # 每个测试方法必须以 test_ 开头 def test_add(self): result = add(2, 3) self.assertEqual(result, 5) # 断言结果是否等于5 def test_add_negative_numbers(self): self.assertEqual(add(-1, -2), -3) ``` #### **3.2 运行测试** ```python if __name__ == '__main__': unittest.main() ``` **运行方式**: 1. 直接执行脚本:`python test_math.py` 2. 命令行运行:`python -m unittest test_math.py` --- ### **4. 常用断言方法** | 方法 | 说明 | |------|------| | `assertEqual(a, b)` | 检查 `a == b` | | `assertTrue(x)` | 检查 `x` 为 True | | `assertFalse(x)` | 检查 `x` 为 False | | `assertRaises(Error, func, *args)` | 验证函数是否抛出指定异常 | | `assertIn(a, b)` | 检查 `a` 是否在 `b` 中 | | `assertIsNone(x)` | 检查 `x` 是 None | --- ### **5. Fixture(前置/清理)** - **`setUp()`**: 每个测试方法执行前调用(如初始化资源)。 - **`tearDown()`**: 每个测试方法执行后调用(如释放资源)。 ```python class TestDatabase(unittest.TestCase): def setUp(self): self.conn = create_database_connection() # 模拟数据库连接 def tearDown(self): self.conn.close() # 关闭连接 def test_query(self): data = self.conn.query("SELECT * FROM users") self.assertIsNotNone(data) ``` --- ### **6. 跳过测试** 使用装饰器跳过某些测试: ```python class TestSkipExample(unittest.TestCase): @unittest.skip("跳过原因") def test_old_feature(self): pass @unittest.skipIf(sys.version_info < (3, 7), "Python 3.7 以下版本跳过") def test_new_feature(self): pass ``` --- ### **7. 测试发现** `unittest` 支持自动发现测试文件: ```bash # 运行当前目录下所有以 test_ 开头的文件 python -m unittest discover # 指定目录和文件模式 python -m unittest discover -s my_tests -p "test_*.py" ``` --- ### **8. 示例完整代码** ```python import unittest # 被测函数 def divide(a, b): if b == 0: raise ValueError("除数不能为0") return a / b # 测试类 class TestDivide(unittest.TestCase): def test_divide_normal(self): self.assertEqual(divide(10, 2), 5) def test_divide_by_zero(self): with self.assertRaises(ValueError): # 验证是否抛出异常 divide(10, 0) if __name__ == '__main__': unittest.main() ``` --- ### **9. 输出结果示例** ``` .. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK ``` - `.` 表示测试通过,`F` 表示失败,`E` 表示错误。 --- 通过 `unittest`,你可以系统化地验证代码逻辑,提升代码质量。如果需要更复杂的功能(如测试报告生成),可以结合第三方库如 `pytest` 或 `HTMLTestRunner`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值