Go语言测试——TDD
百度百科: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 次。
注意:基准测试默认是顺序运行的。
执行结果
<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语言的几种测试方法