ホームページ  >  記事  >  バックエンド開発  >  go を使用して単体テストをエレガントに作成する方法

go を使用して単体テストをエレガントに作成する方法

藏色散人
藏色散人転載
2020-09-07 09:16:501933ブラウズ

次のコラムでは、go を使用して単体テストをエレガントに記述する方法を紹介します。困っている友人の役に立てば幸いです。 !

go を使用して単体テストをエレガントに作成する方法背景

私は若いグループに参加したばかりですが、コードで単体テストを書く時間がありませんでした。リーダーは、プロジェクトのビジネス ロジックに慣れるために、単体テスト テストに合格することを私に求めています。ただし、コードの量は実際には多すぎるため、単体テストを効率的に完了することが主な目標になります。

実装原理

単体テストはtestifyのテストフレームワークを使用しており、非常に使いやすいです具体的な基本的な使用方法については中国のtestifyブログや公式を参照してください。書類。

プロジェクト内のアプリケーション

初期化単体テスト

複雑な Web プロジェクトで、関数が頻繁に必要とする特定のモジュールをテストしますこのモジュールで使用されるサービスを最初に初期化します。初期化関数と初期化関数で使用されるパラメータを同じ単体テスト パッケージに配置します。たとえば、MySQL の初期化は次のようになります:
package unitTestfunc InitMySQL() error{
    return db.Init(constant.MySQLDSN,
    constant.MaxIdleConns,
    constant.MaxOpenConns, 
    time.Duration(constant.ConnMaxLifetime)*time.Second,
    constant.EnableSqlLog)//其他包中已经封装了初始化函数,在测试包的初始化函数中调用即可}func CloseDB() error{
    return db.Close()}
We対応するパラメータを別のコンテンツ パッケージの下に保存します。

package constantconstant(
    MySQLDSN = "username:password@addresss/db?timeout=5000ms&readTimeout=5s&charset=utf8mb4"
    MaxIdleConns = 20
    MaxOpenConns = 20
    ConnMaxLifetime = 60
    EnableSqlLog = true
    MerchantID = 6666
    SheetID = "SZSWIMTEST"
    Operator = "XXXX@XXXX")

単体テストの実行

以下では、データベースの操作を例として取り上げますメインの単体テストです。 最初の部分は固定の書き込みメソッドです

type ActionLogRepo struct {
    basetest.BaseSuite}

2 番目の部分は Register の初期化です Register 関数は 4 つのパラメータ fun1、fun2、fun3、fun4
fun1 を渡すことができます: テスト ファイルは最初に 1 回実行されます。
fun2: 各単体テストの前に 1 回実行します。

fun3: 各単体テストの後に 1 回実行されます。

fun4: このテスト ファイルの最後の実行。
要件に従って、すべての単体テストを開始する前にデータベースの初期化操作を実行し、最後にデータベースを閉じる必要があります。

func TestActionLogRepo(t *testing.T) {
    AgentSuite := new(ActionLogRepo)
    var err error
    AgentSuite.Register(
        func() {
            err = unitTest.InitMySQL()
        },
        nil,
        nil,
        func() {
            err = unitTest.CloseDB()
        })
    assert.Nil(t,err)
    suite.Run(t, AgentSuite)}

3 番目の部分は単体テストを実行することです。最初にデータベース内に対応するデータを確立し、次に単体テストを必要とする関数を呼び出してデータを操作し、次に Assert を使用して結果を検証します。 , 単体テストのレコードを忘れずに削除してください。
func (suite *ActionLogRepo) TestActionLog() {
    repo := repository.NewRepository()//获取数据库
    actionLog := &model.ActionLogTab{XXXXXX}
    err := CreateActionLog(actionLog)//创建测试的数据记录
    assert.Nil(suite.T(),err)
    logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要测试的函数
    assert.Nil(suite.T(),err)
    assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//验证函数的正确性

    err = repo.MerchantDB().Delete(actionLog).Error//删除掉测试的数据库记录
    assert.Nil(suite.T(),err)}

最終的なテスト ファイルの構造は次のとおりです:

package testtype ActionLogRepo struct {
    basetest.BaseSuite}func TestActionLogRepo(t *testing.T) {
    AgentSuite := new(ActionLogRepo)
    var err error
    AgentSuite.Register(
        func() {
            err = unitTest.InitMySQL()
        },
        nil,
        nil,
        func() {
            err = unitTest.CloseDB()
        })
    assert.Nil(t,err)
    suite.Run(t, AgentSuite)}func (suite *ActionLogRepo) TestActionLog() {
    repo := repository.NewRepository()//获取数据库
    actionLog := &model.ActionLogTab{XXXXXX}
    err := CreateActionLog(actionLog)//创建测试的数据记录
    assert.Nil(suite.T(),err)
    logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要测试的函数
    assert.Nil(suite.T(),err)
    assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//验证函数的正确性

    err = repo.MerchantDB().Delete(actionLog).Error//删除掉测试的数据库记录
    assert.Nil(suite.T(),err)}

以上がgo を使用して単体テストをエレガントに作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。