zoukankan      html  css  js  c++  java
  • Go-单元测试

        文章转载地址:https://www.flysnow.org/2017/05/16/go-in-action-go-unit-test.html

    什么是单元测试?

         单元测试一般用来测试我们的代码逻辑是否有问题,有没有按照我们的期望运行,以保证代码质量

         大多数的单元测试都是针对某一个函数方法进行测试,以尽可能的保证没有问题或问题可以被我们预知

         现在,我们在 package main 里定义一个函数,求两数之和的函数,然后我们使用单元测试进行求和逻辑

    测试

        main.go

    package main
    
    // 定一个求两数之和的函数
    func Add(a,b int) int {
    	return a + b
    }
    

      main_test.go

    package main
    
    import "testing"
    
    // 使用单元测试进行 main.go 文件里面求和函数的逻辑测试
    func TestAdd(t *testing.T) {
    	sum := Add(1,2)
    
    	if sum == 3 {
    		t.Log("the result is ok")
    	}else {
    		t.Fatal("the result is wrong")
    	}
    }
    

      然后我们在终端的项目目录下运行 go test -v 就可以看到测试结果:

    === RUN   TestAdd
    --- PASS: TestAdd (0.00s)
        main_test.go:10: the result is ok
    PASS
    ok      _/E_/GoProject/development/src  0.689s
    

      有测试成功的标记 PASS

           Go 语言为我们提供了测试框架,以方便我们更容易的进行单元测试,但是要使用这个框架,需要遵循以下几个准则:

          1.含有单元测试代码的文件必须以 _test.go 结尾

          2.单元测试文件名 _test.go 前面的部分最好是被测试方法所在 go 文件的文件名

          3.单元测试的函数必须以 Test 开头

          4.测试函数的签名必须接收一个指向 testing.T 类型的指针,并且不能返回任何值

          5.函数名最好是 Test + 要测试的方法函数名

    表组测试

          还有一种单元测试方法叫表组测试,这个和基本的单元测试非常相似,只不过它有好几个不同的输入以及输出组成的一组

    单元测试

          比如上面的例子中,我们测试了 1+ 2,如果我们再测试 3 + 4 ,9 +2 等,这就有了好几个输入,同时也对应好几个输出,这

    种一次性测试很多个输入输出场景的测试,就是表组测试:

    package main
    
    import "testing"
    
    // 使用单元测试进行 main.go 文件里面求和函数的逻辑测试
    func TestAdd(t *testing.T) {
    	sum := Add(1,2)
    
    	if sum == 3 {
    		t.Log("the result is ok")
    	}else {
    		t.Fatal("the result is wrong")
    	}
    
    	sum = Add(3,4)
    	if sum == 7 {
    		t.Log("the result is ok")
    	}else {
    		t.Fatal("the result is wrong")
    	}
    }
    

    测试覆盖率

          我们尽可能多的模拟更多场景去测试我们的代码,但是有的时候也会忘记测试的代码,这时候我们就需要测试覆盖率作为参考了

          由单元测试的代码,触发运行到被测试代码的行数占所有代码行数的比例,叫做测试覆盖率,代码覆盖率不一定精准,但是可以

    作为参考,可以帮我们测量和我们预计的覆盖率之间的差距,如下示例:

          main.go

    package main
    
    import "fmt"
    
    func Tag(tag int)  {
    	switch tag {
    	case 1:
    		fmt.Println("Android")
    	case 2:
    		fmt.Println("Go")
    	case 3:
    		fmt.Println("Java")
    	default:
    		fmt.Println("PHP")
    	}
    }
    

      main_test.go

    package main
    
    import "testing"
    
    func TestTag(t *testing.T) {
    	Tag(1)
    	Tag(2)
    }
    

      现在我们使用 go test 工具运行单元测试,和前面不一样的是我们需要测试覆盖率,所以多加一个参数 -converprofile,

    完整的命令:go test -v -coverprofile=c.out 会生成一个覆盖率文件就是 c.out :

    === RUN   TestTag
    Android
    Go
    --- PASS: TestTag (0.00s)
    PASS
    coverage: 60.0% of statements
    ok      _/E_/GoProject/development/src  0.503s
    

      我们可以看到输出结果中显示覆盖率 60% 不到 100%, 生成报告中有 go 为我们提供的工具,使用 go tool cover -html=c.out

    -o=tag.html 可以生成一个 tag.html 文件,这个文件可以详细告诉我们哪一行代码被测试到了,哪一行代码没被测试到:

          上图中被标记为绿色的代码已经被测试到了,红色的还没有被测试到,现在我们来进一步完善:

    func TestTag(t *testing.T) {
    	Tag(1)
    	Tag(2)
    	Tag(3)
    	Tag(6)
    }
    

      

           我们可以看到覆盖率已经 100%

  • 相关阅读:
    HDU 2544 (Djikstra)
    HDU 1237(表达式求值)
    HDU1690 (Floyd)
    《大道至简》读后感
    第6周总结
    第8周总结
    第7周总结
    第四周总结
    第5周总结
    java程序
  • 原文地址:https://www.cnblogs.com/leeyongbard/p/10409149.html
Copyright © 2011-2022 走看看