教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言测试——TDD

Go语言测试——TDD

发布时间:2022-02-15   编辑:jiaochengji.com
教程集为您提供Go语言测试——TDD等资源,欢迎您收藏本站,我们将为您提供最新的Go语言测试——TDD资源
<h2>服务计算</h2><h4>简单介绍:</h4>

百度百科:TDD
TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。
TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。
TDD的重要目的不仅仅是测试软件,测试工作保证代码质量仅仅是其中一部分,而且是在开发过程中帮助客户和程序员去除模棱两可的需求。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。

TDD周期:

TDD周期

参考:《Learn Go with tests》

<h4>先写测试</h4><pre><code class="lang-go">package iteration import "testing" func TestRepeat(t *testing.T) { repeated := Repeat("a") expected := "aaaaa" if repeated != expected { t.Errorf("expected '%q' but got '%q'", expected, repeated) } } </code></pre>

尝试运行测试:

发现报错,这是因为没有定义Repeat函数。

<h4>先使用最少的代码来让失败的测试先跑起来</h4>

现在只需让代码可编译,这样你就可以检查测试用例能否通过

<pre><code class="lang-go">package iteration import "testing" func TestRepeat(t *testing.T) { repeated := Repeat("a") expected := "aaaaa" if repeated != expected { t.Errorf("expected '%q' but got '%q'", expected, repeated) } } func Repeat(character string) string { return "" } </code></pre>

运行:(它期待的输出为"aaaaa",但是实际上输出了"")

<h4>我们接着补全测试程序,使其能够正常运行:</h4><pre><code class="lang-go">func Repeat(character string) string { var repeated string for i := 0; i < 5; i { repeated = repeated character } return repeated } </code></pre>

执行:

测试通过!

<h4>重构</h4>

重构就是通过调整程序代码,但并不改变程序的功能特征,达到改善软件的质量、性能,使程序的设计模式和架构更趋合理,更容易被理解,提高软件的扩展性和维护性。

现在是时候重构并引入另一个构造(construct) = 赋值运算符。

<pre><code class="lang-go">const repeatCount = 5 func Repeat(character string) string { var repeated string for i := 0; i < repeatCount; i { repeated = character } return repeated } </code></pre>

通过测试

<h4>基准测试</h4>

基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。

在 Go 中编写基准测试(benchmarks)是该语言的另一个一级特性,它与编写测试非常相似

<pre><code class="lang-go">func BenchmarkRepeat(b *testing.B) { for i := 0; i < b.N; i { Repeat("a") } } </code></pre>

你会看到上面的代码和写测试差不多。
testing.B 可使你访问隐性命名(cryptically named)b.N。
基准测试运行时,代码会运行 b.N 次,并测量需要多长时间。
代码运行的次数不会对你产生影响,测试框架会选择一个它所认为的最佳值,以便让你获得更合理的结果。
用 go test -bench=. 来运行基准测试。 (如果在 Windows Powershell 环境下使用 go test -bench=".")

基准测试

以上结果说明运行一次这个函数需要 227纳秒(在我的电脑上),为了测试它运行了 4734451 次。
注意:基准测试默认是顺序运行的。

<h4>练习</h4><ul><li>修改测试代码,以便调用者可以指定字符重复的次数,然后修复代码</li></ul><pre><code class="lang-go">package iteration import "testing" func TestRepeat(t *testing.T) { repeated := Repeat("a", 9) expected := "aaaaaaaaa" if repeated != expected { t.Errorf("expected '%q' but got '%q'", expected, repeated) } } func Repeat(character string, num int) string { var repeated string for i := 0; i < num; i { repeated = character } return repeated } </code></pre>

执行结果

<ul><li>写一个 <code>ExampleRepeat</code> 来完善你的函数文档
为了完善函数文档,我们还需要写一个示例测试。在repeat_test.go文件里面加入一个示例测试函数ExampleRepeat:</li></ul><pre><code class="lang-go">func ExampleRepeat() { str := Repeat("abc", 5) fmt.Println(str) //Output: abcabcabcabcabc } </code></pre>

运行测试结果

结果表明测试函数和示例测试函数都执行成功。

注意备注部分是必要的,它会根据注释的Output去检测你的输出,如果示例测试和输出不符会报错:

<pre><code class="lang-go">func ExampleRepeat() { str := Repeat("abc", 5) fmt.Println(str) //Output: abcabcabcabc } </code></pre>

更改注释部分的Output的内容使其与实际输出不符而导致错误

<ul><li>看一下 strings 包。找到你认为可能有用的函数,并对它们编写一些测试。投入时间学习标准库会慢慢得到回报。


string包


对Compare编写测试:
</li></ul><pre><code class="lang-go">package main import ( "fmt" "strings" "testing" ) func TestCompare(t *testing.T) { str1 := strings.Compare("a", "b") expected1 := -1 if str1 != expected1 { t.Errorf("expected '%v' but got '%v'", expected1, str1) } str2 := strings.Compare("d", "d") expected2 := 0 if str2 != expected2 { t.Errorf("expected '%v' but got '%v'", expected2, str2) } } func ExampleCompare() { str := strings.Compare("abc", "abc") fmt.Println(str) //Output: 0 } </code></pre>

对Compare编写测试

测试通过!

<h3>Go语言快排算法实现TDD实践报告:</h3><h4>先写测试</h4><pre><code class="lang-go">package main import ( "testing" ) const MAX = 10 var array = []int{39, 4, 96, 51, 33, 12, 21, 109, 169, 37} func TestSort(t *testing.T) { str := quickSort(array, 0, MAX-1) expected := []int{4, 12, 21, 33, 37, 39, 51, 96, 109, 169} for i := 0; i < 10; i { if array[i] != expected[i] { t.Errorf("expected '%v' but got '%v'", expected[i], array[i]) } } } </code></pre><h4>尝试运行</h4>

<h4>先使用最少的代码来让失败的测试先跑起来</h4><pre><code class="lang-go">package main import ( "testing" ) const MAX = 10 var array = []int{39, 4, 96, 51, 33, 12, 21, 109, 169, 37} func TestSort(t *testing.T) { quickSort(array, 0, MAX-1) expected := []int{4, 12, 21, 33, 37, 39, 51, 96, 109, 169} for i := 0; i < 10; i { if array[i] != expected[i] { t.Errorf("expected '%v' but got '%v'", expected[i], array[i]) } } } func quickSort(array []int, left, right int) { } </code></pre>

运行

<h4>我们接着补全测试程序,使其能够正常运行:</h4><pre><code class="lang-go">package main import ( "testing" ) const MAX = 10 var array = []int{39, 4, 96, 51, 33, 12, 21, 109, 169, 37} func TestSort(t *testing.T) { quickSort(array, 0, MAX-1) expected := []int{4, 12, 21, 33, 37, 39, 51, 96, 109, 169} for i := 0; i < 10; i { if array[i] != expected[i] { t.Errorf("expected '%v' but got '%v'", expected[i], array[i]) } } } func quickSort(array []int, left, right int) { if left < right { pos := partition(array, left, right) quickSort(array, left, pos-1) quickSort(array, pos 1, right) } } func partition(array []int, left, right int) int { key := array[right] i := left - 1 for j := left; j < right; j { if array[j] <= key { i swap(i, j) } } swap(i 1, right) return i 1 } func swap(a, b int) { array[a], array[b] = array[b], array[a] } </code></pre>

成功运行

<h4>基准测试</h4><pre><code class="lang-go">func BenchmarkQuickSort(b *testing.B) { for i := 0; i < b.N; i { arr2 := []int{8, 4, 9, 2, 1, 7, 6, 5, 0, 3} quickSort(arr2, 0, MAX-1) } } </code></pre>

基准测试

运行一次这个函数需要 173纳秒(在我的电脑上),为了测试它运行了 7344356 次。

到此这篇关于“Go语言测试——TDD”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Go语言测试——TDD
MySQL中group_concat函数使用例子
常见的导致mysql中文乱码问题
MySQL中BOOL/BOOLEAN 与 TINYINT 区别 - 测试笔记
解决电脑不能打字处理方法
使用SHOW PROFILE查找MySQL中的SQL耗时瓶颈
mysql中文乱码问题解决方法总结
MySQL latin1字符集中文乱码解决方案
mysql中利用sql语句来提取分割符
golang进阶(七)——go语言的几种测试方法

[关闭]
~ ~