ゴーコア開発の研究ノート(Nianqi) - ユニットテスト

ユニットには効果をテスト:機能やパッケージの導入の確認結果は正しいです。

伝統的な方法は:テスト出力の結果と期待される結果は、一貫しているかどうか
に効果的であることが、本番環境では何かを持っている、そのような環境、テスト環境はありません。
管理につながらない、テストフレームワークの必要性は、問題を解決するために。

Golangで軽量テストテストフレームワーク移動テストテストコマンドをテストし、性能試験装置を実装する(実行コードに時間がかかります)。
ユニットテストによって、次のような問題を解決します:

  1. 各機能が実行されていることを確認し、その結果が正しく出力されます。
  2. パフォーマンスを確保するための書き込みコードが良いです
  3. 論理ユニットテストはエラー、問題の解決策を見つけるために早期のエクスポージャーのプログラムの設計と実装の使用を発見することができます。
  4. 性能試験は、プログラミング上の多くの問題に焦点を当てた、だけでなく、プログラムが高い同時実行で安定を維持することができます。

使用ユニットテスト

  1. フォルダを作成して個別に試験し、主に()アイソレーションテストを実行すると、ファイルのmain()エントリを必要としません。
  2. _test.goファイルを抽出し.GO機能のテストファイルは、テスト_test.goパッケージをインポートする必要があります。

例:

	package tst
	import "testing"

	func Test<dest>(t *testing.T) {
		//引入测试函数1
		//引入测试函数2
	}

ケースシミュレーション:パッケージを作成し、2つの論文、Accumu.goとAccumu_test.go内側に、次のように書かれた二つの文書を書くTST

Accumu.go

	//>>> Accumu.go <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	
	package tst
	
	func Accumu(n int) int {        //就是一个累加器,没啥说得,没有main()
		res := 0
		for i := 0 ; i <= n ; i++ {
			res += i
		}
		return res
	}                 

Accumu_test.go

	//>>> Accumu_test.go <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

	//测试单个文件:切换到此目录下,go test -v会默认测试所有函数,如果只想测试其中一个,需要命令 go test -v Accumu_test.go Accumu.go
	//测试单个方法:切换到此目录下,需要命令 go test -v -test.run Accumu
	
	package tst

	import (
		"testing"       //需要导入testing包
	)

	func TestAccumu(t *testing.T) {    //在Goland中,默认test文件都会直接出此类格式
		res := Accumu(10)              //测试结果与res所传函数有关,与函数名无关
		if res != 55 {
			t.Fatalf("应输入值为%v,实际输出为%v",55,res)   //遇到错误即终止,并会反馈结果为FAIL
		}
		t.Logf("程序测试正确!")    //如果测试无异常则打印PASS,后面日志为t.logf()中的字符串内容
	}                   //关于测试结果,Goland中测试文件都会有一个红色箭头,因此无需黑屏终端go test命令来使用

次のようにテスト結果は以下のとおりです。

/*
e:\Golear\src\tst>go test -v
=== RUN   TestAccumu
--- PASS: TestAccumu (0.00s)
    cal_test.go:12: 程序测试正确!
PASS
ok      _/e_/Golear/src/tst     0.536s

e:\Golear\src\tst>go test -v -test.run Accumu
=== RUN   TestAccumu
--- PASS: TestAccumu (0.00s)
    cal_test.go:12: 程序测试正确!
PASS
ok      _/e_/Golear/src/tst     0.607s
*/

ユニットテスト、実際のアプリケーションと組み合わせて使用​​+ +ファイルをシリアライズとデシリアライズ:

需要:構造の作成:ヒーローズの
フィールド:名前文字列、年齢int型、趣味の文字列
方法:ストア()構造体変数が内のファイルkunkun.txtに保存されたシリアライズ後
RevStore()ファイル構造変数kunkun.txtの概要からは、読み取りおよびデシリアライズ
ユニットテスト:上記2つの方法をテストは正常です。

:(コアコードセグメント)、生産として想定容易に試験することができません

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

type KunFamily struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Hobby string `json:"hobby"`
}

func (k *KunFamily) Store() bool {       //为了确保测试,故返回布尔值
	slice, err := json.Marshal(k)
	if err != nil {
		fmt.Println("序列化失败,失败原因为: ",err)
		return false
	}

	file, err := os.OpenFile("D:/kunkun.txt", os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("请检查错误为:", err)
		return false
	}
	defer file.Close()
	writer := bufio.NewWriter(file)
	_, _ = writer.WriteString(string(slice))
	_ = writer.Flush()
	return true
}

func (k *KunFamily) RevStore() bool {      //为了确保测试,故返回布尔值
	//读取文件
	file := "D:/kunkun.txt"
	content, err := ioutil.ReadFile(file)
	if err != nil {
		fmt.Println("读取错误,错误为:", err)
		return false
	}
	//反序列化
	err1 := json.Unmarshal([]byte(content), k)      //err := json.Unmarshal([]byte(string), &<struct结构体变量>)
	if err1 != nil {
		fmt.Println("反序列化出现异常,异常报错为:",err1)
		return false
	}
	return true
}

func main() {
	var caixukun1  = &KunFamily{"蔡徐坤1",20,"鸡你太美"}
	caixukun1.Store()
	caixukun1.RevStore()
}

テストファイル)を生産:(コードセグメント、x.goから償却されます

package tst
import (
	"bufio"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

type KunFamily struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Hobby string `json:"hobby"`
}
func (k *KunFamily) Store() bool {
	slice, err := json.Marshal(k)
	if err != nil {
		fmt.Println("序列化失败,失败原因为: ",err)
		return false
	}

	file, err := os.OpenFile("D:/kunkun.txt", os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("请检查错误为:", err)
		return false
	}
	defer file.Close()
	writer := bufio.NewWriter(file)
	_, _ = writer.WriteString(string(slice))
	_ = writer.Flush()
	return true
}
func (k *KunFamily) RevStore() bool {
	file := "D:/kunkun.txt"
	content, err := ioutil.ReadFile(file)
	if err != nil {
		fmt.Println("读取错误,错误为:", err)
		return false
	}

	err1 := json.Unmarshal([]byte(content), k)      //err := json.Unmarshal([]byte(string), &<struct结构体变量>)
	if err1 != nil {
		fmt.Println("反序列化出现异常,异常报错为:",err1)
		return false
	}
	return true
}

書かれたテストファイル:(x_test.go)

package tst

import (
	"testing"
	)

func TestKunFamily_Store(t *testing.T) {
	var caixukun  = &KunFamily{"蔡徐坤1",20,"鸡你太美"}
	res := caixukun.Store()
	if res != true {
		t.Fatalf("测试失败")
	}
	t.Logf("程序测试正确!")
}

func TestKunFamily_RevStore(t *testing.T) {
	var caixukun  = &KunFamily{"蔡徐坤1",20,"鸡你太美"}
	res := caixukun.RevStore()
	if res != true {
		t.Fatalf("测试失败")
	}
	t.Logf("程序测试正确!")
}
公開された49元の記事 ウォン称賛18 ビュー3998

おすすめ

転載: blog.csdn.net/weixin_41047549/article/details/90477305