测试驱动开发入门

2025-06-07

测试驱动开发入门

测试驱动开发被认为是软件行业的最佳实践,但许多团队在发布代码时并没有进行测试。

它是什么

测试驱动开发 (TDD) 是一种在编写代码之前编写测试来创建软件的方法。

Bob 叔叔用三条规则来描述 TDD:

  • 除非是为了通过失败的单元测试,否则您不得编写任何生产代码。
  • 您不能编写过多的单元测试,以免导致失败;编译失败也属于失败。
  • 您不得编写超出足以通过一个失败的单元测试的生产代码。

为尚不存在的代码编写测试似乎不太直观;然而,通过首先编写测试,我们可以确保对代码将要执行的操作有一个清晰的预期,并且还可以保证我们不会拖延和搁置编写测试,直到为时已晚。

虽然记下想到的任何代码并在编译器运行之前将代码拼凑在一起似乎更容易,但最终你会花更多的时间来调试匆忙编写的代码而不是编写测试,这会导致代码不合格,甚至更糟糕的是,你没有为将来编写任何测试。

对于小型项目或编码练习来说,测试可能不是必需的,但为了在可预见的未来保持程序和项目的健康和稳定,测试驱动开发是必经之路。

为什么重要

有些人非常重视测试写作,他们秉持“如果没有测试,它就是坏的”这一口头禅。

测试驱动开发对调试有很大帮助,并减少了查找错误所花费的时间。

先写测试的一个好处是,它们不会被遗漏。假设你的截止日期很紧,为了节省时间,你跳过了写测试。你发布了新功能,然后又回到了原点,截止日期还是一样,不得不从开发中剔除测试。很快,你就发布了一个充满 bug 且没有测试的代码库!

通过使用测试驱动开发并首先编写测试,

如何实现

许多编程语言都有用于测试的库和框架。JavaScript 有JestMocha。Rubyrspec。Python内置了测试模块以及 Pytest(https://docs.pytest.org/en/latest/)。Java 有 JUnit(https://junit.org/junit5/)——如果它是一种编程语言,那么它可能有一个测试框架。

无论你选择哪种类型的框架,你都会编写一个具有预期结果的测试。如果你的预期结果或断言评估为真,则测试通过。如果为假,则测试失败。

让我们看一下在 Ruby on Rails 中构建的 url 缩短 Web 应用程序中创建 url 对象的两个测试。

require 'test_helper'

class UrlsControllerTest < ActionDispatch::IntegrationTest
  test "should create a new url" do
    url = Url.new
    assert url.save
  end

  test "should only save a unique url" do
    url = Url.new
    url.text = "https://www.amazon.com/Ruby-Under-Microscope-Illustrated-Internals/dp/1593275277"
    assert_not url.save, "Saved a duplicated URL"
  end
end
Enter fullscreen mode Exit fullscreen mode

这里我们有两个测试,测试“应该创建一个新的 url”和测试“应该检索一个现有的 url”。

第一个测试创建了一个新的 url 对象,然后断言我们可以将该 url 保存到数据库。Ruby 判断 url 对象上的 save 方法是否成功执行,并返回 true,即断言成功。

第二个测试确保我们只保存唯一的 URL——如果该 URL 已存在于数据库中,我们宁愿引导用户访问现有的 URL 对象。然而,我们并没有直接与实际数据库中的数据进行比对,而是在所谓的测试夹具中创建了虚拟数据。

测试装置的目的是确保我们有一个标准的测试运行环境,以便结果可重复。

我们的 urls.yml 文件中有一个对象,我们可以用它来测试我们的代码。

ruby_book_page:
  text: https://www.amazon.com/Ruby-Under-Microscope-Illustrated-Internals/dp/1593275277
  short: f0r
Enter fullscreen mode Exit fullscreen mode

由于此对象位于 urls.yml 文件中,我们的代码会将其视为数据库中现有的 url 对象。我们的代码会创建一个新的 url,将 Amazon 链接赋值给 text 属性。当保存失败并返回 false 时,assert_not 测试即为成功。

如果没有任何验证,URL 就会被保存,测试就会失败。接下来,我们将代码添加到 URL 模型中,该模型将验证每个 URL,并且只接受唯一的 URL。

class Url < ApplicationRecord
  validates :text, uniqueness: true
end

Enter fullscreen mode Exit fullscreen mode

然后我们再次运行测试并看到它通过,从而完成测试驱动开发的过程(无论如何对于那行代码而言)。

有很多不同的方法和方式来测试您的代码——希望这可以帮助您朝着正确的方向迈出一步。

文章来源:https://dev.to/chasestevens/getting-started-with-test-driven-development-1o8f
PREV
Ruby 中的元编程
NEXT
开发人员最常见的 Web 可访问性错误及其解决方法