面向对象程序测试:从基础到实践
1. 测试跳过与预期失败
在测试过程中,有时我们需要根据特定条件跳过某个测试方法或函数。 py.test
提供了一个便捷的装饰器来实现这一点。这个装饰器接受一个字符串,该字符串可以包含任何能计算为布尔值的可执行 Python 代码。例如,下面的测试只会在 Python 3 或更高版本上运行:
import py.test
@py.test.mark.skipif("sys.version_info <= (3,0)")
def test_python3():
assert b"hello".decode() == "hello"
py.test.mark.xfail
装饰器的行为类似,但它将测试标记为预期失败,类似于 unittest.expectedFailure()
。如果测试成功,它将被记录为失败;如果测试失败,则会被报告为预期行为。对于 xfail
,条件参数是可选的;如果未提供,测试将在所有条件下都被标记为预期失败。
2. 模拟昂贵对象
有时候,我们要测试的代码需要一个难以构造或成本高昂的对象。这可能意味着我们的 API 需要重新设计,以拥有更易于测试(通常也更易用)的接口。但有时我们会发现自己在编写测试代码时,需要大量的样板代码来设置与被测试代码只是间接相关的对象。
例如,我们有一段代码用于在键值存储(如 Redis 或 Memcache)中跟踪航班状态,以便存储