当前位置:网站首页 > 技术博客 > 正文

pythonunittest框架详解



TestCase 类的实例代表 unittest 宇宙中的逻辑测试单元。 此类旨在用作基类,具体测试由具体子类实现。 此类实现了测试运行程序所需的接口以允许它驱动测试,以及测试代码可用于检查和报告各种故障的方法。

TestCase 的每个实例都将运行一个基本方法:名为 methodName 的方法。 在 TestCase 的大多数使用中,您既不会更改 methodName,也不会重新实现默认的 方法。

TestCase 实例提供三组方法:一组用于运行测试,另一组由测试实现用于检查条件和报告失败,以及一些查询方法允许收集有关测试本身的信息。

第一组中的方法(运行测试)是:

调用方法来准备测试夹具。 这是在调用测试方法之前立即调用的; 除了 AssertionError 或 SkipTest,此方法引发的任何异常都将被视为错误而不是测试失败。 默认实现什么都不做。

在调用测试方法并记录结果后立即调用方法。 即使测试方法引发异常也会调用它,因此子类中的实现可能需要特别小心检查内部状态。 除 AssertionError 或 SkipTest 之外的任何异常,由该方法引发的将被视为额外错误而不是测试失败(从而增加报告错误的总数)。 无论测试方法的结果如何,仅当 setUp() 成功时才会调用此方法。 默认实现什么都不做。

在运行单个类中的测试之前调用的类方法。 以类作为唯一参数被调用,并且必须装饰为 classmethod():

有关更多详细信息,请参阅 类和模块装置 。

在单个类中的测试运行后调用的类方法。 以类作为唯一参数被调用,并且必须装饰为 classmethod():

有关更多详细信息,请参阅 类和模块装置 。

运行测试,将结果收集到作为 result 传递的 TestResult 对象中。 如果省略 result 或 ,则创建一个临时结果对象(通过调用 defaultTestResult() 方法)并使用。 结果对象返回给 run() 的调用者。

简单地调用 TestCase 实例也可以产生同样的效果。

在测试方法或 setUp() 期间调用它会跳过当前测试。 有关更多信息,请参阅 跳过测试和预期失败 。

,

返回一个上下文管理器,它执行封闭的代码块作为子测试。 msgparams 是可选的任意值,当子测试失败时会显示这些值,让您可以清楚地识别它们。

一个测试用例可以包含任意数量的子测试声明,并且它们可以任意嵌套。

有关详细信息,请参阅 使用子测试区分测试迭代 。

运行测试而不收集结果。 这允许将测试引发的异常传播给调用者,并可用于支持在调试器下运行测试。

TestCase 类提供了几种断言方法来检查和报告失败。 下表列出了最常用的方法(更多断言方法见下表):

方法

检查

新进

3.1

3.1

3.1

3.1

3.1

3.1

3.2

3.2

所有断言方法都接受一个 msg 参数,如果指定,则用作失败时的错误消息(另见 longMessage)。 注意 msg 关键字参数可以传递给 assertRaises(), assertRaisesRegex(), assertWarns(), assertWarns () 仅当它们用作上下文管理器时。

, ,

测试 firstsecond 是否相等。 如果比较的值不相等,则测试将失败。

此外,如果 firstsecond 是完全相同的类型,并且是 list、tuple、dict、set、frozenset 或 str 之一或子类向 addTypeEqualityFunc 注册的任何类型() 将调用特定于类型的相等函数以生成更有用的默认错误消息(另请参阅 特定于类型的方法列表 )。

, ,

测试 firstsecond 不相等。 如果值比较相等,则测试将失败。

,
,

测试 expr 为真(或假)。

请注意,这相当于 而不是 (后者使用 )。 当有更具体的方法可用时,也应避免使用此方法(例如 而不是 ),因为它们在发生故障时提供了更好的错误消息。

, ,
, ,

测试 firstsecond 对同一个对象求值(或不求值)。

,
,

测试 expr 是(或不是)。

, ,
, ,

测试 member 是否在 容器 中。

, ,
, ,

测试 obj 是(或不是)cls 的实例(可以是一个类或类的元组,由 isinstance() 支持) . 要检查确切的类型,请使用 assertIs(type(obj), cls)。

还可以使用以下方法检查异常、警告和日志消息的产生:

方法

检查

新进

提升 exc

引发 exc 并且消息匹配正则表达式 r

3.1

引发 warn

3.2

引发 warn 并且消息匹配正则表达式 r

3.2

块以最低 级别 登录 logger

3.4

, , ,
, ,

测试当使用任何位置或关键字参数调用 callable 时是否引发异常,这些参数也传递给 assertRaises()。 如果引发 exception,则测试通过,如果引发另一个异常,则测试为错误,如果未引发异常,则测试失败。 要捕获一组异常中的任何一个,可以将包含异常类的元组作为 exception 传递。

如果只给出了 exception 和可能的 msg 参数,则返回一个上下文管理器,以便被测代码可以内联而不是作为函数编写:

当用作上下文管理器时,assertRaises() 接受额外的关键字参数 msg

上下文管理器会将捕获的异常对象存储在其 属性中。 如果目的是对引发的异常执行额外检查,这可能很有用:

, , , ,
, , ,

与 assertRaises() 类似,但也测试 regex 是否与引发异常的字符串表示匹配。 regex 可以是正则表达式对象,也可以是包含适合 re.search() 使用的正则表达式的字符串。 例子:

或者:

, , ,
, ,

测试当使用任何位置或关键字参数调用 callable 时触发警告,这些参数也传递给 assertWarns()。 如果触发了 warning,则测试通过,否则测试失败。 任何异常都是错误。 要捕获一组警告中的任何一个,可以将包含警告类的元组作为 warnings 传递。

如果只给出了 warning 和可能的 msg 参数,则返回一个上下文管理器,以便被测代码可以内联而不是作为函数编写:

当用作上下文管理器时,assertWarns() 接受额外的关键字参数 msg

上下文管理器会将捕获的警告对象存储在其 属性中,并将触发警告的源代码行存储在 和 属性中。 如果目的是对捕获的警告执行额外检查,这可能很有用:

无论调用时是否有警告过滤器,此方法都有效。

, , , ,
, , ,

与 assertWarns() 类似,但也测试 regex 是否与触发警告的消息匹配。 regex 可以是正则表达式对象,也可以是包含适合 re.search() 使用的正则表达式的字符串。 例子:

或者:

,

一个上下文管理器,用于测试至少有一条消息记录在 logger 或其子节点之一上,至少具有给定的 级别

如果给出, logger 应该是一个 logging.Logger 对象或一个 str 给出记录器的名称。 默认是根记录器,它将捕获所有消息。

如果给定,level 应该是数字日志级别或其等效字符串(例如 或 )。 默认值为 。

如果 块内发出的至少一条消息与 loggerlevel 条件匹配,则测试通过,否则失败。

上下文管理器返回的对象是一个记录助手,它跟踪匹配的日志消息。 它有两个属性:

匹配日志消息的 logging.LogRecord 对象列表。

str 对象列表,带有匹配消息的格式化输出。

例子:

还有其他方法用于执行更具体的检查,例如:

方法

检查

新进

3.1

3.1

3.1

3.1

3.1

3.2

ab 具有相同数量的相同元素,无论它们的顺序如何。

3.2

, , , ,
, , , ,

通过计算差值来测试 firstsecond 是否近似(或不近似)相等,四舍五入到给定的小数位数 places(默认为 7),以及与零相比。 请注意,这些方法将值四舍五入到给定的 小数位数 (即 像 round() 函数)而不是 有效数字

如果提供 delta 而不是 places,则 firstsecond 之间的差异必须小于或等于(或大于)[ X163X]delta。

提供 deltaplaces 会引发 TypeError。

, ,
, ,
, ,
, ,


测试一下第一的分别是 >、>=、< 或 <= 比第二取决于方法名称。 如果没有,测试将失败:

, ,
, ,

测试 regex 搜索是否匹配(或不匹配)text。 如果失败,错误消息将包括模式和 text(或模式和 text 意外匹配的部分)。 regex 可以是正则表达式对象,也可以是包含适合 re.search() 使用的正则表达式的字符串。

, ,

测试序列 first 包含与 second 相同的元素,无论它们的顺序如何。 如果他们不这样做,则会生成一条错误消息,列出序列之间的差异。

比较 firstsecond 时,重复元素不会被 忽略 。 它验证每个元素在两个序列中是否具有相同的计数。 等效于: 但也适用于不可散列对象的序列。

assertEqual() 方法将相同类型对象的相等性检查分派给不同的特定于类型的方法。 大多数内置类型已经实现了这些方法,但也可以使用 addTypeEqualityFunc() 注册新方法:

,

注册一个由 assertEqual() 调用的特定于类型的方法,以检查完全相同 typeobj(非子类)的两个对象是否比较相等。 function 必须采用两个位置参数和第三个 msg=None 关键字参数,就像 assertEqual() 一样。 当检测到前两个参数之间的不等式时,它必须引发 self.failureException(msg) - 可能提供有用的信息并在错误消息中详细解释不等式。

assertEqual() 自动使用的特定于类型的方法列表总结在下表中。 请注意,通常不需要直接调用这些方法。

方法

用来比较

新进

字符串

3.1

序列

3.1

列表

3.1

元组

3.1

集或冻结集

3.1

听写

3.1

, ,

测试多行字符串 first 是否等于字符串 second。 当不相等时,突出显示差异的两个字符串的差异将包含在错误消息中。 在将字符串与 assertEqual() 进行比较时,默认使用此方法。

, , ,

测试两个序列是否相等。 如果提供了 seq_type,则 firstsecond 都必须是 seq_type 的实例,否则将引发故障。 如果序列不同,则会构建一条错误消息,显示两者之间的差异。

这个方法不是直接被assertEqual()调用,而是用来实现assertListEqual()和assertTupleEqual()。

, ,
, ,

测试两个列表或元组是否相等。 如果不是,则会构建一条错误消息,仅显示两者之间的差异。 如果任一参数的类型错误,也会引发错误。 在将列表或元组与 assertEqual() 进行比较时,默认使用这些方法。

, ,

测试两组是否相等。 如果不是,则构建一个错误消息,列出集合之间的差异。 在将集合或冻结集与 assertEqual() 进行比较时,默认使用此方法。

如果 firstsecond 没有 方法,则失败。

, ,

测试两个字典是否相等。 如果不是,则会构造一条错误消息,显示字典中的差异。 默认情况下,此方法将用于在调用 assertEqual() 时比较字典。

最后 TestCase 提供了以下方法和属性:

无条件发出测试失败信号,错误消息为 msg 或 。

这个类属性给出了测试方法引发的异常。 如果测试框架需要使用专门的异常,可能携带额外的信息,它必须子类化这个异常,以便与框架“公平竞争”。 该属性的初始值为 AssertionError。

此类属性确定当自定义失败消息作为 msg 参数传递给失败的 assertXYY 调用时会发生什么。 是默认值。 在这种情况下,自定义消息会附加到标准失败消息的末尾。 当设置为 时,自定义消息将替换标准消息。

通过在调用断言方法之前将实例属性 self.longMessage 分配给 或 ,可以在单个测试方法中覆盖类设置。

在每次测试调用之前重置类设置。

此属性通过报告失败差异的断言方法控制差异输出的最大长度。 默认为 80*8 个字符。 受此属性影响的断言方法是 assertSequenceEqual()(包括所有委托给它的序列比较方法)、assertDictEqual() 和 assertMultiLineEqual()。

将 设置为 意味着没有最大差异长度。

测试框架可以使用以下方法来收集有关测试的信息:

返回此测试对象表示的测试数量。 对于 TestCase 实例,这将始终是 。

返回应用于此测试用例类的测试结果类的实例(如果没有其他结果实例提供给 run() 方法)。

对于 TestCase 实例,这将始终是 TestResult 的实例; TestCase 的子类应该根据需要覆盖它。

返回标识特定测试用例的字符串。 这通常是测试方法的全名,包括模块和类名。

返回测试的描述,如果没有提供描述,则返回 。 此方法的默认实现返回测试方法文档字符串的第一行(如果可用)或 。

, ,

在tearDown()后添加一个函数,用于清理测试时使用的资源。 函数的调用顺序与它们添加的顺序相反 (LIFO)。 当它们被添加时,任何参数和关键字参数都会被调用到 addCleanup() 中。

如果 setUp() 失败,意味着 tearDown() 没有被调用,那么任何添加的清理函数仍然会被调用。

如果 setUp() 引发异常,则在 tearDown() 或 setUp() 之后无条件调用此方法。

它负责调用addCleanup()添加的所有清理函数。 如果您需要调用清理函数 prior 到 tearDown() 那么您可以自己调用 doCleanups()。

doCleanups() 从清理函数堆栈中一次弹出一个方法,因此可以随时调用。

, , ,
此类实现了 TestCase 接口的一部分,该接口允许测试运行器驱动测试,但不提供测试代码可用于检查和报告错误的方法。 这用于使用遗留测试代码创建测试用例,允许将其集成到基于 unittest 的测试框架中。

  • 上一篇: oracle中的内连接
  • 下一篇: sscom使用教程
  • 版权声明


    相关文章:

  • oracle中的内连接2025-06-30 14:01:05
  • 梯度提升树原理2025-06-30 14:01:05
  • 电脑定时关机软件e.超牛软件下载2025-06-30 14:01:05
  • 梅尔倒谱系数的含义2025-06-30 14:01:05
  • 软件运维工程师主要做什么2025-06-30 14:01:05
  • sscom使用教程2025-06-30 14:01:05
  • usb驱动详解2025-06-30 14:01:05
  • 跳表实现排行榜2025-06-30 14:01:05
  • scanf函数的功能是什么2025-06-30 14:01:05
  • rsyslog syslog2025-06-30 14:01:05