【问题标题】:What is the canonical way to isolate unit tests in Python with assertion-style tests?将 Python 中的单元测试与断言式测试隔离的规范方法是什么?
【发布时间】:2014-07-22 17:40:06
【问题描述】:

我最近问过这个question 并意识到我还想知道是否有一种方法可以通过断言式测试来实现“期望”隔离。我复制并粘贴了一个简单的例子来说明我所说的“期望”隔离。

我对 Python 比较陌生,来自 Ruby/JavaScript,并且拥有 Rspec 和 Jasmine 等测试库,这使我能够在测试单个函数时隔离“期望”。由于似乎没有积极维护的 Python 的“期望”式库,我想知道是否有办法使用 unittest 或 pytest(据我了解的 2 个最流行的 Python 测试库)实现等效的测试风格)。

foo.py

class Foo():
    def bar(self, x):
        return x + 1

期望风格/描述风格

test_foo.py

describe Foo:
    describe self.bar:
        before_each:
            f = Foo()

        it 'returns 1 more than its arguments value':
            expect f.bar(3) == 4

        it 'raises an error if no argument is passed in':
            expect f.bar() raiseError

单元测试/断言风格

test_foo.py

 class Foo():
     def test_bar(x):
         x = 3
         self.assertEqual(4)
         x = None
         self.assertRaises(Error)

【问题讨论】:

  • 如果我错了,请纠正我,您是在询问在 python 中提供describe/it/expect 断言样式的模块?
  • 我确实在另一个问题中问过这个问题。这个问题旨在通过 unittest/pytest 的断言式测试实现相同的功能。 chepner 提供了一个我认为是正确的答案。

标签: python unit-testing tdd bdd


【解决方案1】:

unittest 模块是标准库的一部分。

class TestFoo(unittest.TestCase):
    def setUp(self):
        self.f = Foo()

    def test_bar(self):
        self.assertEqual(self.f.bar(3), 4)

    def test_missing_argument(self):
        self.assertRaises(TypeError, self.f.bar())

【讨论】:

  • 所以每个“it”期望都是一个测试函数,这是有道理的。据我了解,向测试添加文档字符串也会为测试输出提供类似的“它执行此操作”描述,对吗?我一直难以找到的另一件事是如何检查正在调用的函数。不是模拟,而是实际功能。如果我有一个有条件地调用 3 个函数中的 1 个函数的函数,我将如何检查调用了哪个函数而不测试最终结果,这应该是对该函数与调用函数的测试。
  • 您还可以将字符串作为附加参数传递给assert* 方法,如果断言失败,则会显示该参数。至于确定三个函数中的哪一个被另一个调用,我认为您需要使用模拟,并重新设计该函数以允许dependency injection。但是,如果您发布一个新问题,您可能会从比我了解更多的人那里得到更好的答案。
  • 请注意,assertEqual 优于 assertEquals,因为后者在 python-3.x 中是 deprecated
  • 这是我的错字,但我只是添加注释而不是修复以强调有两个名称非常相似的方法,我用错了一个:)
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多