我是*唯一*一个看不到测试驱动开发原则好处的人吗?

Am I the *only* one who doesn't see the benefit of the test driven development principles?

几个月来,我一直在尝试在 Python 中学习 TDD,因为听到许多比我更有才华和技能的程序员都赞扬它的优点。我绝对看到了测试的好处,对此我一点也不争论。我遇到困难的是 TDD 的基本工作流程(据我了解):

  1. 想想您需要编写的下一段代码。
  2. 对于那段代码,编写一个无法通过那段代码应该实现的测试。
  3. 运行 您正在测试的程序,断言它在预期的地方失败了。
  4. 写下您认为会使 3 中的测试成功的代码,并重复直到成功。
  5. 重复!

我很难进入这个流程的最大原因是它占用的时间。我解释它的方式是,对于可能需要我 30 秒才能单独编写的每一行代码,至少需要一分钟。考虑以下示例:

import requests
r = requests.get('http://whosebug.com/')
print(r.status_code)
>>> 200

当然不是一个有用的代码块,但它完成了一项任务并检查完成状态。我以 'non-TDD' 的方式在大约 30 秒内写完了。以 TDD 风格编写的等价物至少需要两倍的时间,因为在脚本之间切换、编写失败的测试、断言测试确实失败、然后编写 get 方法的使用等。

那么,我的第二个问题是:考试有什么用?如果我断言 status_code 是 200,我真的只是在测试 requests 模块中编写的逻辑吗?我从我绝对知道会失败的测试中学到什么,或者根据我正在测试的逻辑条件绝对知道会成功?

我的思维过程可能存在的一个问题是,我根本没有学到 足够的 TDD - 也就是说,一开始让你养成明智写作的习惯可能很痛苦测试,但最终它成为第二天性。即使是这种情况,无缝编写测试仍然需要时间,而且随着应用程序复杂性的增加,时间也会增加。

我很确定我在这一切上一定是错的,因为我读过很多人 "at" 我有一天想要达到的水平,他们对 TDD 说了很多好话。那么,我的思路哪里错了?!

编写测试更像是一种思考需求以及如何实现这些需求的方式。在我看来,也许您需要使用一些 TDD 框架。我认为你做 TDD 感到困难的原因之一是 Python 没有重要的 TDD 框架(尽管人们说:生命短暂所以我使用 Python)。如果你使用 Ruby 和 Rspec,你会发现 TDD 并不难。

通过使用一些框架,您可以轻松设计您的测试逻辑,并且对于您今天编写的许多步骤,您可以简单地在未来的测试用例中重用它们。

希望对您有所帮助:

此外,如果您想进一步探索 TDD 世界,可以尝试使用 BDD。如果您有兴趣使用 BDD,我建议您使用 Python Behave。

http://pythonhosted.org/behave/

快速示例,假设您想测试请求库

您可以像这样编写测试用例

When I try to request "https://whosebug.com/"
Then I could get response code is "200"

并且在 BDD 中,您可以像这样定义您的步骤

@when('I try to request "{my_url}"')
def step_impl(context, my_url):
    context.last_result = requests.get(my_url)

@then('I could get response code is "{code}"')
def step_impl(context, code):
    context.last_result.status_code.should.be.eq(code)

一旦你到达这里,你明天就可以简单地使用你的步骤作为

When I try to request "fake_url"
Then I could get response code is "404"

When I try to request "url_needs_autho"
Then I could get response code is "401"

您现在可以测试库或函数的任何行为。人生苦短所以我用Python