提供流畅风格的unittest断言。
项目描述
PyTruth:Python中的真值
以流畅的风格提供unittest断言。翻译自Java实现,google/truth。
许可证
PyTruth遵循Apache 2.0许可协议。
免责声明
PyTruth不是官方的Google产品。
贡献
在创建拉取请求之前,请参阅贡献指南。
支持
PyTruth不是积极维护的项目。不提供支持。
它被共享给社区,为可能使用unittest、abseil、googletest、mox和mock组合的项目带来一种表达性、一致性的断言风格——特别是熟悉Java Truth的人。
用户组: pytruth-users@googlegroups.com
安装
可以使用pip安装PyTruth
pip install pytruth
概述
导入truth
模块,并将AssertThat()
方法别名到断言事物
from truth.truth import AssertThat
然后,而不是写
self.assertEqual(a, b)
self.assertTrue(c)
self.assertIn(a, d)
self.assertTrue(a in d and b in d)
self.assertTrue(a in d or b in d or c in d)
with self.assertRaises(Error):
Explode()
人们会写
AssertThat(a).IsEqualTo(b)
AssertThat(c).IsTrue()
AssertThat(d).Contains(a)
AssertThat(d).ContainsAllOf(a, b)
AssertThat(d).ContainsAnyOf(a, b, c)
with AssertThat(Error).IsRaised():
Explode()
测试应该更容易阅读和编写,并且更清晰地流动。
限制
unittest断言接受一个msg
参数,如果断言失败则显示。PyTruth没有这样的机制,尽管其失败消息通常更有信息。
被测试主题的类型(传递给AssertThat()
的参数)将在运行时才知道,这与Java不同,Java在编译时就知道类型。IDE可能无法正确地自动完成断言主题上的可用谓词。
在Python 2中,None
小于除了它本身之外的所有其他事物。None
小于nan
,并且它小于负无穷大。因此,当函数可能返回None
时要小心。无论Func()
返回负数还是None
,断言AssertThat(Func()).IsLessThan(0)
都会成功。相反,在执行不等式断言之前,首先使用IsNone()
或IsNotNone()
检查返回值的None
状态。
在Python 3中,None
不再可以使用<
、>
、<=
或>=
进行比较。PyTruth检测Python解释器的版本,并相应地进行比较或失败,而不是允许Python 3的TypeError
向上冒泡。
如果共享值(无论是预期值还是实际值)的迭代器更改了该值或其底层元素,行为是未定义的:所有、没有或某些断言可能成功或失败,任意。
此库是线程安全的;您可以并行执行多个断言。
转换菜谱
通用
unittest | PyTruth |
---|---|
assertEqual(a, b) |
AssertThat(a).IsEqualTo(b) |
assertNotEqual(a, b) |
AssertThat(a).IsNotEqualTo(b) |
assertTrue(a) |
AssertThat(a).IsTruthy() |
assertFalse(a) |
AssertThat(a).IsFalsy() |
assertIs(a, True) |
AssertThat(a).IsTrue() |
assertIs(a, False) |
AssertThat(a).IsFalse() |
assertIs(a, b) |
AssertThat(a).IsSameAs(b) |
assertIsNot(a, b) |
AssertThat(a).IsNotSameAs(b) |
assertIsNone(a) |
AssertThat(a).IsNone() |
assertIsNotNone(a) |
AssertThat(a).IsNotNone() |
assertIn(a, b) |
AssertThat(a).IsIn(b) |
assertIn(a, [b, c, d]) |
AssertThat(a).IsAnyOf(b, c, d) |
assertNotIn(a, b) |
AssertThat(a).IsNotIn(b) |
assertNotIn(a, [b, c, d]) |
AssertThat(a).IsNoneOf(b, c, d) |
assertIsInstance(a, b) |
AssertThat(a).IsInstanceOf(b) |
assertIsNotInstance(a, b) |
AssertThat(a).IsNotInstanceOf(b) |
assertTrue(hasattr(a, b)) |
AssertThat(a).HasAttribute(b) |
assertFalse(hasattr(a, b)) |
AssertThat(a).DoesNotHaveAttribute(b) |
assertTrue(callable(a)) |
断言AssertThat(a).IsCallable() |
assertFalse(callable(a)) |
断言AssertThat(a).IsNotCallable() |
真值
PyTruth支持比unittest更细致的真值区分。特别是,它区分了“是True
”和“是真值”。unittest的assertTrue(x)
等价于assertIs(bool(x), True)
,而其assertFalse(x)
等价于assertIs(bool(x), False)
。PyTruth的IsTrue()
和IsFalse()
谓词仅匹配布尔主语True
和False
本身。因此,不要盲目地将assertTrue()
转换为IsTrue()
,同样地,也不要将assertFalse()
和IsFalse()
进行转换。
真值断言 | 结果 | 假值断言 | 结果 |
---|---|---|---|
assertTrue(True) |
成功 | assertFalse(False) |
成功 |
assertTrue(1) |
成功 | assertFalse(0) |
成功 |
assertTrue(None) |
失败 | assertFalse(None) |
成功 |
AssertThat(True).IsTrue() |
成功 | AssertThat(False).IsFalse() |
成功 |
AssertThat(1).IsTrue() |
失败 | AssertThat(0).IsFalse() |
失败 |
AssertThat(None).IsTrue() |
失败 | AssertThat(None).IsFalse() |
失败 |
AssertThat(True).IsTruthy() |
成功 | AssertThat(False).IsFalsy() |
成功 |
AssertThat(1).IsTruthy() |
成功 | AssertThat(0).IsFalsy() |
成功 |
AssertThat(None).IsTruthy() |
失败 | AssertThat(None).IsFalsy() |
成功 |
字符串
unittest | PyTruth |
---|---|
assertEqual(len(s), n) |
AssertThat(s).HasLength(n) |
assertTrue(s.startswith('a')) |
AssertThat(s).StartsWith('a') |
assertTrue(s.endswith('a')) |
AssertThat(s).EndsWith('a') |
assertRegex(s, r) assertRegexpMatches(s, r) |
AssertThat(s).ContainsMatch(r) |
assertNotRegex(s, r) assertNotRegexpMatches(s, r) |
AssertThat(s).DoesNotContainMatch(r) |
assertRegex(s, '^r') assertRegexpMatches(s, '^r') |
AssertThat(s).Matches('r') |
assertNotRegex(s, '^r') assertNotRegexpMatches(s, '^r') |
AssertThat(s).DoesNotMatch('r') |
匹配字符串
传递给匹配函数的r
参数可以是r'原始字符串'
,或者来自re.compile()
的返回的匹配对象。
数字、字符串和其他可比较的事物
unittest | PyTruth |
---|---|
assertLess(a, b) |
AssertThat(a).IsLessThan(b) |
assertGreater(a, b) |
AssertThat(a).IsGreaterThan(b) |
assertLessEqual(a, b) |
AssertThat(a).IsAtMost(b) |
assertGreaterEqual(a, b) |
AssertThat(a).IsAtLeast(b) |
数字
unittest | PyTruth |
---|---|
assertEqual(a, 0) |
AssertThat(a).IsZero() |
assertNotEqual(a, 0) |
AssertThat(a).IsNonZero() |
assertEqual(a, float('inf')) |
AssertThat(a).IsPositiveInfinity() |
assertEqual(a, float('-inf')) |
AssertThat(a).IsNegativeInfinity() |
assertFalse(a.isinf() or a.isnan()) |
AssertThat(a).IsFinite() |
assertTrue(a.isinf() or a.isnan()) |
AssertThat(a).IsNotFinite() |
assertTrue(a.isnan()) |
AssertThat(a).IsNan() |
assertFalse(a.isnan()) |
AssertThat(a).IsNotNan() |
assertAlmostEqual(a, b, delta=d) |
AssertThat(a).IsWithin(d).Of(b) |
assertNotAlmostEqual(a, b, delta=d) |
AssertThat(a).IsNotWithin(d).Of(b) |
列表、字符串和其他可迭代对象
unittest | PyTruth |
---|---|
assertEqual(len(a), n) |
AssertThat(a).HasSize(n) |
assertEqual(len(a), 0) |
AssertThat(a).IsEmpty() |
assertGreaterThan(len(a), 0) |
AssertThat(a).IsNotEmpty() |
assertIn(b, a) |
AssertThat(a).Contains(b) |
assertNotIn(b, a) |
AssertThat(a).DoesNotContain(b) |
assertTrue(b in a and c in a) |
AssertThat(a).ContainsAllOf(b, c) AssertThat(a).ContainsAllIn([b, c]) |
assertTrue(b in a or c in a) |
AssertThat(a).ContainsAnyOf(b, c) AssertThat(a).ContainsAnyIn([b, c]) |
assertTrue(b in a and c in a and len(a) == 2) |
AssertThat(a).ContainsExactly(b, c) |
assertCountEqual(a, b) assertItemsEqual(a, b) |
AssertThat(sorted(a)).ContainsExactlyElementsIn(sorted(b)).InOrder() |
assertTrue(b not in a and c not in a) |
AssertThat(a).ContainsNoneOf(b, c) AssertThat(a).ContainsNoneIn([b, c]) |
N/A | AssertThat(a).ContainsNoDuplicates() |
N/A | AssertThat(a).IsOrdered() |
N/A | AssertThat(a).IsOrderedAccordingTo(cf) |
N/A | AssertThat(a).IsStrictlyOrdered() |
N/A | AssertThat(a).IsStrictlyOrderedAccordingTo(cf) |
absltest | PyTruth |
---|---|
assertLen(a, n) |
AssertThat(a).HasSize(n) |
assertEmpty(a) |
AssertThat(a).IsEmpty() |
assertNotEmpty(a) |
AssertThat(a).IsNotEmpty() |
定义顺序
传递给IsOrderedAccordingTo()
和IsStrictlyOrderedAccordingTo()
的cf
参数应是一个遵循cmp(x, y)
契约的可调用对象:如果x < y,则返回负数;如果x == y,则返回零;如果x > y,则返回正数。
有序表示可迭代对象的元素必须从开始到结束递增(或递减,取决于cf
)。相邻元素可以是相等的。严格有序表示除了这些之外,元素还必须是唯一的(即,单调递增或递减)。
IsOrdered()
等价于 IsOrderedAccordingTo(cmp)
。
IsStrictlyOrdered()
等价于 IsStrictlyOrderedAccordingTo(cmp)
。
断言顺序
默认情况下,ContainsAll...
和ContainsExactly...
不会强制要求被测试对象中元素的顺序与预期值的顺序相匹配。要执行此操作,请将InOrder()
附加到返回的谓词。
包含断言 | 结果 |
---|---|
AssertThat([2, 4, 6]).ContainsAllOf(6, 2) |
成功 |
AssertThat([2, 4, 6]).ContainsAllOf(6, 2).InOrder() |
失败 |
AssertThat([2, 4, 6]).ContainsAllOf(2, 6).InOrder() |
成功 |
AssertThat([2, 4, 6]).ContainsExactly(2, 6, 4) |
成功 |
AssertThat([2, 4, 6]).ContainsExactly(2, 6, 4).InOrder() |
失败 |
AssertThat([2, 4, 6]).ContainsExactly(2, 4, 6).InOrder() |
成功 |
当使用InOrder()
时,确保被测试对象和预期值都有一个可预测的顺序,否则结果是不确定的。例如,AssertThat(list_a).ContainsExactlyElementsIn(set_a).InOrder()
可能成功也可能失败,具体取决于set
如何实现排序。
字典,除了上述内容外
unittest | PyTruth |
---|---|
assertIn(k, d) |
AssertThat(d).ContainsKey(k) |
assertNotIn(k, d) |
AssertThat(d).DoesNotContainKey(k) |
assertIn((k, v), d.items()) |
AssertThat(d).ContainsItem(k, v) |
assertNotIn((k, v), d.items()) |
AssertThat(d).DoesNotContainItem(k, v) |
assertEqual(d, {k1: v1, k2: v2}) |
AssertThat(d).ContainsExactly(k1, v1, k2, v2) |
assertEqual(d1, d2) |
AssertThat(d1).ContainsExactlyItemsIn(d2) |
assertDictContainsSubset(d1, d2) |
AssertThat(d1.items()).ContainsAllIn(d2.items()) |
异常
unittest | PyTruth |
---|---|
with assertRaises(e) |
with AssertThat(e).IsRaised() |
with assertRaisesRegex(e, r) |
with AssertThat(e).IsRaised(matching=r) |
N/A | with AssertThat(e).IsRaised(containing='a') |
assertEqual(e.message, m) |
AssertThat(e).HasMessage(m) |
assertTrue(e.message.startswith('a')) |
AssertThat(e).HasMessageThat().StartsWith('a') |
assertIn(a, e.args) |
AssertThat(e).HasArgsThat().Contains(a) |
匹配引发的异常
当使用AssertThat(e).IsRaised()
上下文期望异常时,任何引发的异常类型等于e
或e
的子类都被接受。如果引发了一个不是e
子类的异常,则断言失败。
AssertThat(e).IsRaised()
上下文中的e
参数可以是像ValueError
这样的异常类,也可以是像ValueError('some error')
这样的异常实例。如果传递了一个实例,那么由测试代码引发的任何异常都必须也是期望异常的子类,并且还必须有匹配的message
和args
属性。
模拟函数
unittest | PyTruth |
---|---|
m.assert_called() |
AssertThat(m).WasCalled() |
m.assert_not_called() |
AssertThat(m).WasNotCalled() |
m.assert_called_once() |
AssertThat(m).WasCalled().Once() |
assertEqual(m.call_count, n) |
AssertThat(m).WasCalled().Times(n) |
m.assert_called_with(*a, **k) |
AssertThat(m).WasCalled().LastWith(*a, **k) |
m.assert_called_once_with(*a, **k) |
AssertThat(m).WasCalled().Once().With(*a, **k) |
N/A | AssertThat(m).WasCalled().With(*a, **k).Once() |
m.assert_has_calls(calls, any_order=True) |
AssertThat(m).HasCalls(calls) |
m.assert_has_calls(calls, any_order=False) |
AssertThat(m).HasCalls(calls).InOrder() |
N/A | AssertThat(m).HasExactlyCalls(c1, c2) |
N/A | AssertThat(m).HasExactlyCalls(c1, c2).InOrder() |
m.assert_any_call(*a, **k) |
AssertThat(m).WasCalled().With(*a, **k) |
一次被调用,带参数
《WasCalled().Once().With(...)》和《WasCalled().With(...).Once()`》断言在细微之处有所不同。《WasCalled().Once().With(...)》断言函数被调用了一次,并且这次调用传递了那些参数。《WasCalled().With(...).Once()`断言函数正好一次传递了那些参数,但允许用其他无关参数调用。因此,《WasCalled().Once().With(...)》是更严格的断言。考虑使用《HasExactlyCalls()`》以提高清晰度。
类
unittest | PyTruth |
---|---|
assertTrue(a.issubclass(b)) |
AssertThat(a).IsSubclassOf(b) |
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
pytruth-1.1.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fecef037f620ac3d6b369b65d7f3a7615238f5c857bbe858562516a6355af32c |
|
MD5 | 701d3d4b09cd281876f40648781b3349 |
|
BLAKE2b-256 | 24612fc9a9cc1144c9123c053741cbf3f19e9213cdf658fef5f993b025e44c29 |
pytruth-1.1.0-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c778f84a7f6f4941c902836484638f40613f2eb239b9b53b7f4c01b40aee255a |
|
MD5 | e71174cc85fe2d7f542b8951299c048e |
|
BLAKE2b-256 | 26cc2680dbc4f6d9b9993098c87fcd5390a9dde49d8a6d3b882c9617defecb59 |