使用包和测试

Go天生就是为了支持良好的项目管理体验而设计的

1、包,go项目和文件名没有关系,和src下目录结构有关

go使用包来管理接口、结构体、方法和变量

包名一般和文件目录名相同,如果不同,构建、安装会以代码包名为准,但是生成的构建文件是以目录名命名的。

一个目录下不能有不同包名的代码文件

下面通过案例介绍

1)、go项目结构通常如下:

我本地GOPATH路径为F:goLangStudydemo,已经设置了环境变量。

bin中是编译后的可执行文件

pkg中是编译后的包文件

src中是源码目录

其中bin和pkg文件夹如果没有,go会自动创建

2)、在src文件夹下创建文件结构如下

3)、math.go和math_pkg.go文件使用同一个包,最终会被编译到一个二进制包文件math.a中;此处可说明文件名可以和包名不一样

 math_pkg.go文件如下:

package math

func Add(a, b int) int {
    return a + b
}

func Substract(a, b int) int {
    return a - b
}

math.go文件如下:

package math

func Multiply(a, b int) int {
    return a * b
}

func Divide(a, b int) int {
    if b == 0 {
        panic("Can not divided by zero")
    }
    return a / b
}

4)、一个项目只能有一个main包,main包相对src的目录结构就对应执行go install main包目录

main.go文件如下(import中math是net.duokr/math源码包别名):

package main

import (
    "fmt"
    math "net.duokr/math"
)

func main() {
    var a = 100
    var b = 200

    fmt.Println("Add demo:", math.Add(a, b))
    fmt.Println("Substract demo:",math.Substract(a,b))
    fmt.Println("Multiply demo:",math.Multiply(a,b))
    fmt.Println("Divide demo:",math.Divide(a,b))
}

5)、编写一个脚本文件,省的每次去执行多行同样的命令,build.bat文件如下(我本地配置了环境变量,就把设置GOPATH那段注释了):

@echo off
rem set GOPATH=GOPATH;F:goLangStudydemo
set GOBIN=F:goLangStudydemoin
go build net.duokrmath
go build main.go
go install main

在src文件夹下,执行完脚本后,目录结构如下(src文件夹下会有个main.exe,是由go build main.go生成):

可以通过go run命令执行main.go;也可以直接运行bin下的bin.exe,查看结果

 2、src下的main文件夹不是必须的,main包的文件名也不一定叫main.go,下面更改后如下

 3、测试代码编写

在math文件夹下创建math_test.go文件,编写测试代码,在当前测试文件所在路径下执行go test命令,会自动执行以_test.go结尾的文件中Test开头的函数,并且测试函数参数为

*testing.T类型

math_test.go代码如下

package math

import(
    "testing"
    "fmt"
)

func TestAdd(t *testing.T){
    var a=100
    var b=200

    var val=Add(a,b)
    if val!=a+b{
        t.Error("Test Case [","TestAdd","] Failed")
    }else{
        fmt.Println("Add Method Pass")
    }
}

func TestSub(t *testing.T){
    var a=100
    var b=200

    var val=Substract(a,b)
    if val!=a-b{
        t.Error("Test Case [","TestAdd","] Failed")
    }else{
        fmt.Println("Substract Method Pass")
    }
}

func TestDemo(t *testing.T){
    fmt.Println("测试代码")
}

func testDemo(t *testing.T){
    fmt.Println("不是测试代码")
}

func TessDemo(t *testing.T){
    fmt.Println("不是测试代码")
}
 
原文地址:https://www.cnblogs.com/hujiapeng/p/9657740.html