zoukankan      html  css  js  c++  java
  • 拾遗:Go 单元测试

    概念

    • 回归测试:是指修改了旧代码之后,重新进行测试,以确保修改没有引入新的错误或导致其它代码产生错误;
    • 单元测试:是指对软件中的最小可测试单元(单个函数或类)进行检查和验证
    • Test-Driven Development(TDD):测试驱动开发,提倡先编写测试代码,再进行开发
      • 先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的直接返回一个合适值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性较小
    • ExtremeProgramming(XP):极限编程,提倡TDD
    • Test Case:测试用例/实例

    概要

    • 在包目录内,所有以_test.go为后缀名的源文件并不是go build构建包的一部分,它们是go test测试的一部分
    • 在*_test.go文件中,有三种类型的函数:测试函数、基准测试函数、示例函数
      • 一个测试函数是以Test为函数名前缀的函数,用于测试程序的一些逻辑行为是否正确;go test命令会调用这些测试函数并报告测试结果是PASS或FAIL
      • 基准测试函数是以Benchmark为函数名前缀的函数,它们用于衡量一些函数的性能;go test命令会多次运行基准函数以计算一个平均的执行时间
      • 示例函数是以Example为函数名前缀的函数,提供一个由编译器保证正确性的示例文档
    • Go 语言采用内置的测试框架进行单元测试,测试文件内均须 import "testing"

    基础测试

    • 测试单个文件
    • # -v 显示详细信息,-cover 显示测试覆盖率
      go test -v -cover=true $GOPATH/src/examples/example_test.go $GOPATH/src/examples/example.go
    • 测试整个包
    • go test -v -cover=true $GOPATH/src/examples/...
    • 执行单个测试用例(-run 选项后跟正则表达式,执行名称匹配的测试函数)
    • go test -v -cover=true $GOPATH/src/examples -run 'TestSucc|XxYyZz'

    表格驱动测试:TableDrivenTests (https://github.com/cweill/gotests)

    • 使用 gotests
    • go get -u github.com/cweill/gotests/...
    • 语法
    • gotests [options] PATH ...
        -all         generate go tests for all functions and methods
        -excl        regexp. generate go tests for functions and methods that don't match. Takes precedence over(优先于) -only,  and -all
        -only        regexp. generate go tests for functions and methods that match only. Takes precedence over -all
        -w           write output to (test) files instead of stdout
        -nosubtests  disable subtest generation. Only available for Go 1.7+
    • 示例
    • # 在当前目录下生成测试代码,使用 -w 选项会自动生成 example_test.go 文件,在其中的 TO DO 位置添加测试输入条目即可
      gotests -all example.go > example_test.go
    • 之后执行基础测试部分的操作获取测试报告

    Mock (https://github.com/golang/mock)

      以可控的模拟对象替换真实对象,以获取测试结果

    • 使用场景
      • 依赖的服务返回不确定的结果,如获取当前时间
      • 依赖的服务返回状态难以复现,如网络错误
      • 依赖的服务环境搭建费时费力,如复杂的 web 服务器环境等
      • 依赖的服务行为多变
    • go 语言实现 mock 的方式
      • 注入依赖对象
      • 实现对应的接口
    • 安装工具:gomock/mockgen
    • go get github.com/golang/mock/gomock
      go get github.com/golang/mock/mockgen
      #go doc code.google.com/p/gomock/gomock
    • 生成测试文件
    • mockgen -source {SourceFile}.go > {DestFile}.go
    • ...

    Go monkeypatching (https://github.com/bouk/monkey)

    • https://segmentfault.com/a/1190000007733142
    • https://github.com/bouk/monkey

    参考资料:

    • http://gopl-zh.b0.upaiyun.com/ch11/ch11-02.html
    • http://mp.weixin.qq.com/s/dnQ-Fp2K1HffxkPwF903eA?utm_source=tuicool&utm_medium=referral
  • 相关阅读:
    ruby计算平方和开方
    Silverlight中DataGrid翻页或者滚动时CheckBox/RadioButton显示的问题
    bat文件设置ip地址
    gcc编译多线程
    TCP Nagle算法
    fork父子进程 信号处理
    Unix守护进程的创建示例
    inline内联函数
    volatile类型
    ioctl获取接口名称、IP地址、MAC地址、广播地址等
  • 原文地址:https://www.cnblogs.com/hadex/p/6774442.html
Copyright © 2011-2022 走看看