ホームページ  >  記事  >  バックエンド開発  >  Ginkgo: BDD Go 言語フレームワーク

Ginkgo: BDD Go 言語フレームワーク

Go语言进阶学习
Go语言进阶学习転載
2023-07-25 14:32:48925ブラウズ

単体テストは、コードの論理単位 (通常はオブジェクトまたは特定の関数) に焦点を当てます。コードの品質を保証するのに十分な単体テストを作成できるため、関数が変更されたり、コードがリファクタリングされたりする場合、十分な単体テスト ケースがあれば十分な自信が得られます。

上記の単体テストは開発仕様です。アジャイル ソフトウェア開発では、テスト駆動開発 (TDD) と動作駆動開発 (BDD) という 2 つのことがよく行われます。それらは実践とテクニックであるだけでなく、デザイン方法論でもあります。

TDD

TDD の基本的な考え方は、テストを通じて開発全体を推進することであり、機能的な開発を行う前にユニットを作成することが原則です。コード、テストケース。次の 5 つのステップが含まれています:

  • 開発者はまずいくつかのテスト ケースを作成します
  • これらを実行しますただし、テスト ケースのビジネス ロジックが実装されていないため、これらのテストは明らかに失敗します。
  • 実装コードの詳細
  • 開発者がコードの実装に成功すると、すべてのテストの実行が成功します。
  • 新しいコードの場合は、時間内にビジネス コードをリファクタリングします。コード関数が正しくない場合、対応するテスト ファイルも失敗します。

新しい関数を開発する必要がある場合は、上記の手順を繰り返します。プロセスは以下のとおりです

Ginkgo: BDD Go 言語フレームワーク

##tdd-flowchart

さらに興味深い Github リポジトリがあります:learn-go-with-tests 、このリポジトリは Go で TDD を学習するように設計されています。

BDD

TDD は開発に焦点を当てており、テスト ケースを使用して開発者が高品質でバグの少ないコードを作成できるように規制および制約します。 BDD は設計に重点を置いており、テスト ケースの設計時にシステムを定義する必要があり、システムの動作を記述するための共通言語の使用を推奨し、システム設計とテスト ケースを組み合わせて開発を推進します。

BDD は TDD から派生したものです。

主な違いはテストの説明です。 BDD は、よりわかりやすい言語を使用してテスト ケースを記述し、実際の結果よりも必要な機能に焦点を当てます。

BDD によってテストを文章のように読み取る機能は、テストに対する認識に変化をもたらし、テストをより適切に作成する方法を考えるのに役立ちます。

Ginkgo

Ginkgo

は、開発者が表現豊かな包括的なテストを作成できるように設計された、Go 言語の BDD テスト フレームワークです。

Ginkgo は Go のネイティブ

testing<span style="font-size: 15px;"></span> ライブラリを統合しています。つまり、## を渡すことができます。 #go test<span style="font-size: 15px;"> を使用して、Ginkgo テスト スイートを実行します。同時に、アサーションおよびモック スイート </span>testify およびリッチ テスト スイート go-check とも互換性があります。ただし、Ginkgo では、gomega ライブラリと組み合わせて使用​​することを推奨しています。 次に、Ginkgo を使って BDD モードのテストコードを体験します。

ダウンロード

使用

go get<span style="font-size: 15px;"> Get</span>

$ go get github.com/onsi/ginkgo/ginkgo
$ go get github.com/onsi/gomega/...

このコマンドは、ginkgo を取得し、<span style="font-size: 15px;">ginkgo</span> 実行可能ファイルを <span style="font-size: 15px;">$GOPATH/bin# # にインストールします。 </span>#。

キットの作成

gopher ライブラリの作成

$ cd path-to-package/gopher

ingopher.go<span style="font-size: 15px;"></span> ファイルには、Gopher<span style="font-size: 15px;"></span> 構造と検証メソッド #Validate<span style="font-size: 15px;"> があります。 </span> 以下のように、

package gopher

import (
 "errors"
 "unicode/utf8"
)

type Gopher struct {
 Name   string
 Gender string
 Age    int
}

func Validate(g Gopher) error {
 if utf8.RuneCountInString(g.Name) < 3 {
  return errors.New("名字太短,不能小于3")
 }

 if g.Gender != "男" {
  return errors.New("只要男的")
 }

 if g.Age < 18 {
  return errors.New("岁数太小,不能小于18")
 }
 return nil
}

ginkgo bootstrap<span style="font-size: 15px;"></span> コマンドを使用して、Ginkgo テストを初期化します。スイート。

$ ginkgo bootstrap
Generating ginkgo test suite bootstrap for gopher in:
        gopher_suite_test.go

このとき、gopher.go<span style="font-size: 15px;">## と同階層のディレクトリに </span> が生成されます。 #gopher_suite_test.go<span style="font-size: 15px;"></span> ファイル、内容は次のとおりです

package gopher_test

import (
 "testing"

 . "github.com/onsi/ginkgo"
 . "github.com/onsi/gomega"
)

func TestGopher(t *testing.T) {
 RegisterFailHandler(Fail)
 RunSpecs(t, "Gopher Suite")
}

此时,我们就可以运行测试套件了,通过命令 <span style="font-size: 15px;">go test</span><span style="font-size: 15px;">ginkgo</span> 均可。

 $ go test
Running Suite: Gopher Suite
===========================
Random Seed: 1629621653
Will run 0 of 0 specs


Ran 0 of 0 Specs in 0.000 seconds
SUCCESS! -- 0 Passed | 0 Failed | 0 Pending | 0 Skipped
PASS
ok      ginkgo/gopher   0.018s

当然,空测试套件没有什么价值,我们需要在此套件下编写测试(Spec)用例。

我们可以在 <span style="font-size: 15px;">gopher_suite_test.go</span> 中编写测试,但是推荐分离到独立的文件中,特别是包中有多个需要被测试的源文件的情况下。

创建 Spec

执行 <span style="font-size: 15px;">ginkgo generate gopher</span>  可以生成一个 <span style="font-size: 15px;">gopher_test.go</span> 测试文件。

 $ ginkgo generate gopher
Generating ginkgo test for Gopher in:
  gopher_test.go

此时测试文件中的内容如下

package gopher_test

import (
 . "github.com/onsi/ginkgo"
)

var _ = Describe("Gopher", func() {

})
编写 Spec

我们基于此测试文件撰写实际的测试用例

package gopher_test

import (
 "ginkgo/gopher"
 . "github.com/onsi/ginkgo"
 "github.com/onsi/gomega"
)

func mockInputData() ([]gopher.Gopher, error) {
 inputData := []gopher.Gopher{
  {
   Name:   "菜刀",
   Gender: "男",
   Age:    18,
  },
  {
   Name:   "小西瓜",
   Gender: "女",
   Age:    19,
  },
  {
   Name:   "机器铃砍菜刀",
   Gender: "男",
   Age:    17,
  },
  {
   Name:   "小菜刀",
   Gender: "男",
   Age:    20,
  },
 }
 return inputData, nil
}

var _ = Describe("Gopher", func() {

 BeforeEach(func() {
  By("当测试不通过时,我会在这里打印一个消息 【BeforeEach】")
 })

 inputData, err := mockInputData()

 Describe("校验输入数据", func() {

  Context("当获取数据没有错误发生时", func() {
   It("它应该是接收数据成功了的", func() {
    gomega.Expect(err).Should(gomega.BeNil())
   })
  })

  Context("当获取的数据校验失败时", func() {
   It("当数据校验返回错误为:名字太短,不能小于3 时", func() {
    gomega.Expect(gopher.Validate(inputData[0])).Should(gomega.MatchError("名字太短,不能小于3"))
   })

   It("当数据校验返回错误为:只要男的 时", func() {
    gomega.Expect(gopher.Validate(inputData[1])).Should(gomega.MatchError("只要男的"))
   })

   It("当数据校验返回错误为:岁数太小,不能小于18 时", func() {
    gomega.Expect(gopher.Validate(inputData[2])).Should(gomega.MatchError("岁数太小,不能小于18"))
   })
  })

  Context("当获取的数据校验成功时", func() {
   It("通过了数据校验", func() {
    gomega.Expect(gopher.Validate(inputData[3])).Should(gomega.BeNil())
   })
  })
 })

 AfterEach(func() {
  By("当测试不通过时,我会在这里打印一个消息 【AfterEach】")
 })
})

可以看到,BDD 风格的测试案例在代码中就被描述地非常清晰。由于我们的测试用例与预期相符,执行 <span style="font-size: 15px;">go test</span> 执行测试套件会校验通过。

 $ go test
Running Suite: Gopher Suite
===========================
Random Seed: 1629625854
Will run 5 of 5 specs

•••••
Ran 5 of 5 Specs in 0.000 seconds
SUCCESS! -- 5 Passed | 0 Failed | 0 Pending | 0 Skipped
PASS
ok      ginkgo/gopher   0.013s

读者可自行更改数据致测试不通过,你会看到 Ginkgo 将打印出堆栈与错误描述性信息。

概要

TDD と BDD は、アジャイル開発でよく言及される方法論です。 TDD と比較して、BDD は 動作と仕様 を記述することによってソフトウェア開発を推進します。これらの動作と仕様は、コード内のより多くの "退屈" 記述情報に反映されます。

BDD の本質を表現する別の方法があります。BDD は開発者がソフトウェアを設計するのに役立ち、TDD は開発者がソフトウェアをテストするのに役立ちます

Ginkgo は、Go 言語の優れた BDD フレームワークであり、開発者が DSL 構文 (Describe/Context/It) を通じてテスト ケースを整理および調整するのに効果的に役立ちます。この記事では、Ginkgo の非常に単純な使用例のみを示しているため、出発点として使用してください。

読者は、Ginkgo を使用する場合、その実行ライフ サイクルを理解する必要があります。重要なポイントには、<span style="font-size: 15px;">It、Context、Describe、BeforeEach、AfterEach、JustBeforeEach、BeforeSuite が含まれます、AfterSuite、By、Fail</span> これらのモジュールの実行シーケンスとセマンティック ロジック。

Ginkgo には、非同期テスト、ベンチマーク テスト、継続的インテグレーション、その他の強力なサポートなど、この記事では取り上げられていない多くの機能があります。そのウェアハウスは https://github.com/onsi/ginkgo にあり、英語版と中国語版の使用ドキュメントも提供されており、読者は Ginkgo についてさらに学ぶことができます。

最後に、Ginkgo フレームワークは K8s プロジェクトでもエンドツーエンド (E2E) テストを作成するために使用されています。学ぶ価値があります。

以上がGinkgo: BDD Go 言語フレームワークの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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