测试驱动的开发与GO
#初学者 #tdd #测试 #go

在本文中,我将讨论有关测试驱动的开发,其方法,在Golang背景下的最佳实践,并提供了一些代码示例。这是我要向您展示一些代码示例的github repo link

简称测试驱动的开发(TDD)是一种软件开发方法,在编写实际代码之前,您可以为一小部分代码编写测试用例。目的是确保代码在各种情况下符合特定要求并正确行为。通过首先编写测试,您可以在开发过程的早期捕获错误,并确保您的代码易于测试,维护和重构。

tdd是编写测试,看到它失败,编写代码通过测试的一个循环,然后重构代码以提高其质量。

test driven development tdd - lifecycle


TDD的动机

  • 有助于尽早发现错误:通过编写实际代码之前编写测试,TDD可以在开发过程的早期捕获错误。这减少了在调试上花费的时间,并确保您的代码更可靠。

  • 确保代码符合要求:TDD确保您的代码满足特定要求,并在各种情况下正确行为。这使得随着项目的发展,可以更轻松地维护和重构代码。

  • 提高代码质量:TDD鼓励开发人员编写模块化,可测试和可维护的代码。这可以提高代码库的整体质量并减少技术债务。

  • 降低了变化的成本:由于TDD确保您的代码经过良好的测试和模块化,因此可以降低对代码库进行更改的成本。这在大型项目中特别有用,在大型项目中,更改可能会对系统产生重大影响。

  • 启用更快的开发:TDD实际上可以通过减少调试和确保新代码不会破坏现有功能的时间来帮助加快开发。

  • 促进协作:TDD为开发人员与其他利益相关者之间的协作提供了一种共同的语言和框架。这有助于确保每个人都在同一页面上,并且项目顺利进行。

  • 增强信心:TDD通过确保正确行为并满足特定要求,使开发人员对其代码的信心。这种信心可以带来更好的决策,更多的创造力和更有效的发展。

在Golang进行测试

golang提供了一个内置的测试工具自动运行测试过程。该工具称为“ go test ”,易于使用,可以从命令行中运行。 GO测试软件包提供了一系列创建和运行测试的功能和方法。它包括用于比较值,报告错误和并行运行测试的功能。

测试软件包还提供了用于报告错误的助手功能,例如“错误”,“错误”和“失败”。这些功能可用于报告测试过程中发生的错误。

这是GO中写的测试案例的示例:

func TestSum(t *testing.T) {
    t.Run("Sum of numbers in array", func(t *testing.T) {
        numbers := []int{5, 4, 3, 2, 1}

        got := Sum(numbers)
        want := 16

        if got != want {
            t.Errorf("got %d, want %d, given %d", got, want, numbers)
        }
    })
}

在Golang编写测试用例时要记住。

测试案例的文件名应该从_test.go开始,即main_test.go,以便GO工具可以在运行go test命令运行测试用例时检测到要执行的文件。

测试代码的函数必须以Test关键字(即TestSum)开始。这就是Go Tool如何知道运行在测试文件中编写的测试功能。

GO的测试工具还可以生成覆盖范围报告,显示您的代码中有多少被测试覆盖。获得测试覆盖范围的命令

go test -cover

GO的测试包还包括对基准的支持,可用于测量代码的性能。基准功能具有特定的签名,并多次执行以提供对性能的准确测量。命令在测试用例上运行基准测试。

go test -bench=.

表驱动测试

GO的测试软件包还支持表驱动的测试,这使您可以测试具有多个输入和预期输出的功能。这对于测试边缘案例和确保您的代码稳健可能很有用。

这是表驱动测试的示例:

func TestSum(t *testing.T) {
    cases := []struct {
        description string
        num1        int
        num2        int
        expected    int
    }{
        {
            description: "1 + 2",
            num1:        1,
            num2:        2,
            expected:    3,
        },
        {
            description: "3 + 4",
            num1:        3,
            num2:        4,
            expected:    7,
        },
        {
            description: "10 + 45",
            num1:        10,
            num2:        45,
            expected:    70,
        },
    }

    for _, tt := range cases {
        t.Run(tt.description, func(t *testing.T) {
            result := Sum(tt.num1, tt.num2)
            if result != tt.expected {
                t.Errorf("expected %d, but got %d", tt.expected, result)
            }
        })
    }
}

TDD遵循的最佳实践

  1. TDD的基本原理是在编写实际代码之前编写测试。

  2. 测试应很小,并专注于单个功能。这使您可以在发生时轻松查明错误。

  3. 使用GO测试工具来简化和加快测试工作流程。

  4. 表驱动的测试使您可以测试具有多个输入和预期输出的函数。这可以帮助您捕获边缘案例并确保您的代码强大。

  5. 编写依赖外部依赖性的测试时,请使用模拟来模拟这些依赖性的行为。这使您可以孤立地测试代码并避免进行片状测试。

  6. 使用此反馈来重构代码,并使其更模块化,可维护和可测试。

  7. 确保您的测试已更新以反映您对代码的任何更改。

  8. 诸如GO测试之类的代码覆盖工具-Cover可以帮助您确定测试未充分覆盖的代码区域。

  9. 使用连续集成(CI)工具来自动化测试工作流程。这样可以确保您的测试定期进行,并且在开发过程的早期都会捕获任何错误。

Go Community的工具

GO带有其内置测试工具,但是世界各地的Go Community也可以使用一些开源工具。这是其中一些主要用于GO项目的方法:

  1. gomega-匹配者/断言lib https://github.com/onsi/gomega

  2. gocheck-精选丰富的测试lib https://github.com/go-check/check

  3. 作证 - 模拟工具包,断言https://github.com/stretchr/testify

  4. gomock-专用的模拟框架https://github.com/golang/mock

  5. 银杏 - 表达式规格的BDD测试框架https://github.com/onsi/ginkgo

结论

测试驱动的开发是一种心理模型,您可以在实际生产代码之前编写测试用例。如果您以前从未写过任何测试案例,则需要一些练习。您要么从事现实世界项目,要么刚开始,您可以开始探索并进行操作。

如果您喜欢我的文章,请喜欢并分享反馈,并在评论中告诉我。而且不要忘记在LinkedinGithubTwitter上关注我。

和平 - ð»