跳转到主要内容

提供流畅风格的unittest断言。

项目描述

PyTruth:Python中的真值

Development Status Build Status PyPI Version Python Versions

以流畅的风格提供unittest断言。翻译自Java实现,google/truth

许可证

PyTruth遵循Apache 2.0许可协议

免责声明

PyTruth不是官方的Google产品。

贡献

在创建拉取请求之前,请参阅贡献指南

支持

PyTruth不是积极维护的项目。不提供支持。

它被共享给社区,为可能使用unittestabseilgoogletestmoxmock组合的项目带来一种表达性、一致性的断言风格——特别是熟悉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()谓词仅匹配布尔主语TrueFalse本身。因此,不要盲目地将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()上下文期望异常时,任何引发的异常类型等于ee的子类都被接受。如果引发了一个不是e子类的异常,则断言失败。

AssertThat(e).IsRaised()上下文中的e参数可以是像ValueError这样的异常,也可以是像ValueError('some error')这样的异常实例。如果传递了一个实例,那么由测试代码引发的任何异常都必须也是期望异常的子类,并且还必须有匹配的messageargs属性。

模拟函数

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 (48.4 kB 查看哈希值)

上传时间

构建分布

pytruth-1.1.0-py2.py3-none-any.whl (45.2 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者