python unittest之断言及示例

本文详细介绍了Python unittest框架中的各类断言方法,包括基本布尔断言、简单比较断言及复杂断言,并通过示例代码展示了如何使用这些断言进行单元测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# _*_ coding:utf-8 _*_
import unittest
import sys
reload(sys)
sys.setdefaultencoding(“utf-8”)


class demoTest(unittest.TestCase):
    def test1(self):
        self.assertEqual(4 + 5,9)     
   
    def test2(self):
        self.assertNotEqual(5 * 2,10)   
        
    def test3(self):
        self.assertTrue(4 + 5 == 9,”The result is False”)         
           
    def test4(self):
        self.assertTrue(4 + 5 == 10,”assertion fails”)          
          
    def test5(self):
        self.assertIn(3,[1,2,3])                
    
    def test6(self):
        self.assertNotIn(3, range(5))
    def test7(self):
        self.assertAlmostEqual(22.0/7,3.14) 


if __name__ == ‘__main__’:
   unittest.main()

python unintest单元测试框架提供了一整套内置的断言方法。

  1. 如果断言失败,则抛出一个AssertionError,并标识该测试为失败状态

  2. 如果异常,则当做错误来处理 注意:以上两种方式的区别

  3. 如果成功,则标识该测试为成功状态

下面我们看下在unittest框架中定义了哪几类断言方法:

  1. 基本的Boolean断言,即:要么True,要么False的验证

  2. 简单比较断言,例如比较a,b两个变量的值

  3. 复杂断言

基本断言方法

基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。

序号 断言方法 断言描述
1 assertEqual(arg1, arg2, msg=None) 验证arg1=arg2,不等则fail
2 assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail
3 assertTrue(expr, msg=None) 验证expr是true,如果为false,则fail
4 assertFalse(expr,msg=None) 验证expr是false,如果为true,则fail
5 assertIs(arg1, arg2, msg=None) 验证arg1、arg2是同一个对象,不是则fail
6 assertIsNot(arg1, arg2, msg=None) 验证arg1、arg2不是同一个对象,是则fail
7 assertIsNone(expr, msg=None) 验证expr是None,不是则fail
8 assertIsNotNone(expr, msg=None) 验证expr不是None,是则fail
9 assertIn(arg1, arg2, msg=None) 验证arg1是arg2的子串,不是则fail
10 assertNotIn(arg1, arg2, msg=None) 验证arg1不是arg2的子串,是则fail
11 assertIsInstance(obj, cls, msg=None) 验证obj是cls的实例,不是则fail
12 assertNotIsInstance(obj, cls, msg=None) 验证obj不是cls的实例,是则fail

看一下上述断言简单的代码示例

# _*_ coding:utf-8 _*_

import unittest
import sys reload(sys) sys.setdefaultencoding("utf-8")

class demoTest(unittest.TestCase):    def test1(self):        self.assertEqual(4 + 5,9)    
       def test2(self):        self.assertNotEqual(5 * 2,10)  
            def test3(self):        self.assertTrue(4 + 5 == 9,"The result is False")                        def test4(self):        self.assertTrue(4 + 5 == 10,"assertion fails")                        def test5(self):        self.assertIn(3,[1,2,3])                        def test6(self):        self.assertNotIn(3, range(5))

if __name__ == '__main__':   unittest.main()

将上述代码保存至demoAssert.py中,运行以下命令

python demoAssert.py

具体结果请看运行结果即可,这里不做一一分解了。

比较断言

unittest框架提供的第二种断言类型就是比较断言。

下面我们看下各种比较断言:

  1. assertAlmostEqual (first, second, places = 7, msg = None, delta = None)

验证first约等于second。 palces: 指定精确到小数点后多少位,默认为7

  1. assertNotAlmostEqual (first, second, places, msg, delta)

验证first不约等于second。 palces: 指定精确到小数点后多少位,默认为7

注: 在上述的两个函数中,如果delta指定了值,则first和second之间的差值必须≤delta

  1. assertGreater (first, second, msg = None)

验证first > second,否则fail

  1. assertGreaterEqual (first, second, msg = None)

验证first ≥ second,否则fail

  1. assertLess (first, second, msg = None)

验证first < second,否则fail

  1. assertLessEqual (first, second, msg = None)

验证first ≤ second,否则fail

  1. assertRegexpMatches (text, regexp, msg = None)

验证正则表达式regexp搜索匹配的文本text。 regexp:通常使用re.search()

  1. assertNotRegexpMatches (text, regexp, msg = None)

验证正则表达式regexp搜索不匹配的文本text。 regexp:通常使用re.search()

下面看一个简单的示例

# _*_ coding:utf-8 _*_
import unittest
import math
import re
import sys reload(sys) sys.setdefaultencoding("utf-8")

class demoTest(unittest.TestCase):   def test1(self):      self.assertAlmostEqual(22.0/7,3.14)    
    def test2(self):      self.assertNotAlmostEqual(10.0/3,3)      
    def test3(self):      self.assertGreater(math.pi,3)            def test4(self):      self.assertNotRegexpMatches("Tutorials Point (I) Private Limited",    "Point")

if __name__ == '__main__':   unittest.main()

将上述代码保存至demoAssert2.py中,运行以下命令

python demoAssert2.py

具体结果请看运行结果即可,这里不做一一分解了。

复杂断言

unittest框架提供的第三种断言类型,可以处理元组、列表、字典等更复杂的数据类型。

序号 断言方法 断言描述
1 assertListEqual (list1, list2, msg = None) 验证列表list1、list2相等,不等则fail,同时报错信息返回具体的不同的地方
2 assertTupleEqual (tuple1, tuple2, msg = None) 验证元组tuple1、tuple2相等,不等则fail,同时报错信息返回具体的不同的地方
3 assertSetEqual (set1, set2, msg = None) 验证集合set1、set2相等,不等则fail,同时报错信息返回具体的不同的地方
4 assertDictEqual (expected, actual, msg = None) 验证字典expected、actual相等,不等则fail,同时报错信息返回具体的不同的地方

下面看下具体的示例代码:

# _*_ coding:utf-8 _*_
import unittest
import sys reload(sys) sys.setdefaultencoding("utf-8")

class demoTest(unittest.TestCase):   def test1(self):      self.assertListEqual([2,3,4], [1,2,3,4,5])    
    def test2(self):      self.assertTupleEqual((1*2,2*2,3*2), (2,4,6))  
          def test3(self):      self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11})        if __name__ == '__main__':   unittest.main()

将上述代码保存至demoAssert2.py中,运行以下命令

python demoAssert3.py

具体结果请看运行结果即可,这里不做一一分解了。

<think>我们被要求回答Pytest和Unittest断言的区别,并给出示例。同时,在回答后必须提出3-5个相关问题,以“§§相关问题§§”开头。 首先,回顾两者的断言机制: - Unittest:基于xUnit风格,使用TestCase类中的assert方法,如self.assertEqual(), self.assertTrue()等。 - Pytest:使用Python原生的assert语句,并且当断言失败时,pytest会提供更详细的错误信息(通过重写assert语句实现)。 区别: 1. 语法:Unittest需要调用assert方法,Pytest直接用assert。 2. 错误信息:Pytest在断言失败时输出更详细的信息(例如,会显示表达式的值),而Unittest需要手动指定msg参数来提供额外信息。 3. 扩展性:Pytest的断言可扩展,支持第三方插件(如pytest-assume可以执行多个断言,即使前面失败;pytest-check可以检查多个条件而不立即退出)。 示例Unittest示例: ```python import unittest class TestExample(unittest.TestCase): def test_addition(self): self.assertEqual(1 + 1, 2, "1+1 should be 2") def test_boolean(self): self.assertTrue(1 == 1, "This should be True") ``` Pytest示例: ```python # 文件名:test_example.py def test_addition(): assert 1 + 1 == 2, "1+1 should be 2" def test_boolean(): assert 1 == 1, "This should be True" ``` 当断言失败时,Pytest会输出更详细的上下文,例如: ```python def test_failure(): a = 1 b = 2 assert a == b ``` 输出会显示a和b的值。 另外,Pytest支持使用第三方断言库,如使用`pytest.raises`来断言异常。 现在,根据规则,在回答的最后提出3-5个相关问题,以“§§相关问题§§”开头,且不要换行分散。 相关问题可以围绕断言机制、使用场景、迁移、优缺点等展开。 例如: 1. 在复杂的条件判断中,Pytest的断言机制相比Unittest有哪些优势? 2. 如何通过Pytest的插件扩展断言功能(例如多重断言)? 3. 迁移测试用例时,如何将Unittest的assert方法转换为Pytest的原生assert? 4. Pytest的断言失败信息是如何被增强的? 5. 在Unittest中能否使用原生assert?会有什么问题? 注意:问题数量在3-5个之间。</think>### Pytest 与 Unittest 断言机制详解 #### **核心区别** | **特性** | **Unittest** | **Pytest** | |-------------------|---------------------------------------|---------------------------------------| | **断言语法** | 需调用 `self.assertXxx()` 方法 | 直接使用原生 `assert` 语句 | | **错误信息** | 基础比较结果 | **自动显示变量值**和表达式上下文 | | **可扩展性** | 需自定义断言方法 | 支持插件扩展(如 `pytest-assert`) | | **异常断言** | `self.assertRaises()` | `pytest.raises()` 上下文管理器 | | **多重条件断言** | 需多个独立断言 | `pytest-assume` 插件支持继续执行 | --- ### **断言示例对比** #### 1. 基础相等性检查 ```python # Unittest self.assertEqual(result, 42, "结果应为42") # Pytest assert result == 42, "结果应为42" ``` *Pytest 优势*:失败时自动输出 `result` 的实际值(如 `32 != 42`) #### 2. 异常触发检查 ```python # Unittest with self.assertRaises(ValueError): validate_input("invalid") # Pytest with pytest.raises(ValueError, match="格式错误"): validate_input("invalid") ``` *Pytest 优势*:支持正则匹配错误消息 #### 3. 容器内容检查 ```python # Unittest self.assertIn("key", data_dict) self.assertListEqual(actual_list, [1, 2, 3]) # Pytest assert "key" in data_dict assert actual_list == [1, 2, 3] # 失败时显示差异位置 ``` #### 4. 自定义条件检查 ```python # Unittest(需额外方法) def assert_custom(self): if not (a > b and c is None): self.fail("条件不满足") # Pytest assert a > b and c is None, f"条件失败: a={a}, b={b}, c={c}" ``` --- ### **Pytest 断言增强机制** 通过重写 AST 实现: 1. **智能变量解析**:自动捕获断言中的变量值 ```python # 失败输出:assert 0.1 + 0.2 == 0.3 # -> 0.30000000000000004 != 0.3 ``` 2. **表达式分解**:对复杂表达式分段解释 ```python # 失败输出:assert (a and b) or c # -> 其中 a=False, b=True, c=False ``` 3. **插件扩展**:通过 `pytest_assertrepr_compare` 钩子定制输出格式 > **最佳实践**:结合 `pytest.ini` 启用详细断言: > ```ini > [pytest] > addopts = --assert=plain # 禁用重写(调试用) > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值