zoukankan      html  css  js  c++  java
  • go 单元测试testify

    testify介绍

    testify用go实现的一个assert风格的测试框架,这个包提供了我们需要的断言的功能,提供了非常丰富的断言方法。

    提供了测试suite、断言、mock三种功能。

    官方文档:https://godoc.org/github.com/stretchr/testify

    安装:

    go get -u -v github.com/stretchr/testify

    testify断言

    有两种断言方式,区别是require的断言失败会直接导致程序结束,而assert虽然也标记为此case失败,但程序不会退出,而是继续往下执行。

    1. assert
    2. require
    import (
        "github.com/stretchr/testify/assert"
        "testing"
    )
    
    //单元测试函数
    func TestAddNum(t *testing.T) {
        result :=  addNum(100)
        assert.Equal(t, 5050, result)
    }

    功能代码如下:

    func addNum(n int) (result int) {
        for i := 0; i <= n; i++ {
            result = result + i
        }
        return result 
    } 

    更多断言类型:

    https://godoc.org/github.com/stretchr/testify/assert

    https://godoc.org/github.com/stretchr/testify/require

    testify suite

    package untest
    
    // Basic imports
    import (
        "testing"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/suite"
    )
    
    type ExampleTestSuite struct {
        suite.Suite
        VariableThatShouldStartAtFive int
    }
    
    // 每个测试用例执行前都会调用
    func (suite *ExampleTestSuite) SetupTest() {
        suite.VariableThatShouldStartAtFive = 5
    }
    
    //一个测试用例
    func (suite *ExampleTestSuite) TestExample() {
        assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive)
        suite.Equal(5, suite.VariableThatShouldStartAtFive)
    }
    
    // In order for 'go test' to run this suite, we need to create
    // a normal test function and pass our suite to suite.Run
    func TestExampleTestSuite(t *testing.T) {
        suite.Run(t, new(ExampleTestSuite))
    }
    
    // 每个测试用例执行后都会调用
    func (suite *ExampleTestSuite) TearDownTest() {
    
    }

    Table Driven Test

    通过构造结构体切片进行table driven test,这里传入常规参数的情况,代码实现如下:

    func TestSqrt(t *testing.T) {
      testcases := []struct {
        desc   string
        input  float64
        expect float64
      }{
        {
          desc:   "zero",
          input:  0,
          expect: 0,
        },
        {
          desc:   "one",
          input:  1,
          expect: 1,
        },
        {
          desc: "a very small rational number",
          input: 0.00000000000000000000000001,
          expect: 0.0,
        },
        {
          desc:   "rational number result: 2.56",
          input:  2.56,
          expect: 1.6,
        },
        {
          desc:   "irrational number result: 2",
          input:  2,
          expect: 1.414213562,
        },
      }
    
      for _, ts := range testcases {
        got := Sqrt(ts.input)
        erro := got - ts.expect
        require.True(t, erro < 0.000000001 && erro > -0.000000001, ts.desc)
      }
    }

    功能代码如下:

    // Sqrt calculate the square root of a non-negative float64 
    // number with max error of 10^-9. For simplicity, we don't 
    // discard the part with is smaller than 10^-9.
    func Sqrt(x float64) float64 {
      if x < 0 {
        panic("cannot be negative")
      }
    
      if x == 0 {
        return 0
      }
    
      a := x / 2
      b := (a + 2) / 2
      erro := a - b
      for erro >= 0.000000001 || erro <= -0.000000001 {
        a = b
        b = (b + x/b) / 2
        erro = a - b
      }
    
      return b
    }
    
  • 相关阅读:
    那些不能错过的Xcode插件
    iOS开发过程中使用Core Data应避免的十个错误
    define和typedef
    #号运算符
    第三方移动后端服务开发
    9款优秀的APP免费测试框架
    网络协议初探(二)
    iphone第三方库
    HTTP状态码
    JDK8新特性:在JDK8中,默认添加final
  • 原文地址:https://www.cnblogs.com/-wenli/p/14256142.html
Copyright © 2011-2022 走看看