TDD /测试的最无缝技术

时间:2013-08-14 12:18:12

标签: python testing tdd pytest

我刚刚发现了测试驱动的开发,我真的很喜欢它的外观,并且想要开始,但是在我看来似乎有一个主要问题。与大多数其他负面评论不同,我看到它的启动很慢或增加了额外的时间等等(我不同意这些观点)。我的问题是它看起来非常......笨重。

这就是我的意思。

如果我要编写测试(使用python和pytest)

def multiply_3_4():
    answer = 3 * 4
    assert answer == 12 

您编写空测试并使其失败为空。然后填写代码以使其通过。

但是我的问题是,好的,所以你现在有了工作代码,那么你将工作代码块从测试功能复制并粘贴到你的主程序中?您进行了一些更改,然后将该部分复制回测试功能以重新测试它以确保您没有损坏任何内容并再次复制回主程序等?

在我看来有点脱节/笨重或无缝。是否有一种方法可以将测试链接到应用程序代码中,例如使用

等标签
# Test 1 starts here
code
code
code
# Test 1 ends here

然后测试功能只会看到这个并使用该代码块运行测试,使其更具有无缝体验。

不容易出现复制和粘贴错误,也不容易在文件和测试功能等之间复制代码。

所以我的问题是,我说的是正确的吗?或者是否有一种特定类型的工作流以更优雅/无缝的方式在测试和实际应用程序代码之间进行?

这是阻止我回到TDD的唯一原因。

2 个答案:

答案 0 :(得分:3)

在您的测试文件中:

import myprog

def test_multiply():
    answer = myprog.multiply()
    assert answer == 12 

在myprog.py中:

def multiply():
    return 3*4

应该没有复制粘贴。只需导入。

在任何阶段,您都应该能够运行单元测试,它应该让您反馈程序的哪些部分正在工作或需要工作。


要使程序既可导入又可运行,您可以用这种通用结构编写程序:

<import statements>
define CONSTANTS
Class and function definitions
if __name__ == '__main__':
    main()

if __name__ == '__main__':套件将在程序运行时执行,但不会在导入程序qua module 时执行。 因此,不需要在模块级别挂起任何不可测试的代码。

答案 1 :(得分:0)

除此之外,还有一个名为TDD as you mean it的技术,它遵循您尝试使用的内容。

您在同一个文件中编写代码并进行测试,并在获得绿色状态后,只需将代码移动到它应该的实际位置。

我已经尝试过了,有时它工作正常,特别是如果我只想快速尝试一下。使用现代IDE和重构工具,将代码移动到另一个方法或类很容易。

但是当你刚开始使用TDD时,请不要理会这一点:)坚持经典规则!