>  기사  >  백엔드 개발  >  Ginkgo: BDD Go 언어 프레임워크

Ginkgo: BDD Go 언어 프레임워크

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-25 14:32:48925검색

단위 테스트의 초점은 일반적으로 객체 또는 특정 기능인 코드의 논리적 단위입니다. 함수가 수정되거나 코드가 리팩토링될 때 충분한 단위 테스트를 작성하면 충분한 자신감을 얻을 수 있습니다.

위의 단위 테스트는 개발 사양입니다. 애자일 소프트웨어 개발에는 TDD(테스트 중심 개발)와 BDD(행동 중심 개발)라는 두 가지 자주 방문하는 방문자가 있습니다. 이는 관행과 기술일 뿐만 아니라 디자인 방법론이기도 합니다.

TDD

TDD의 기본 아이디어는 테스트를 통해 전체 개발을 촉진하는 것입니다. 기능 코드를 개발하기 전에 단위 테스트 케이스를 작성하는 것이 원칙입니다. 다음 5단계로 구성됩니다.

  • 개발자는 먼저 일부 테스트 사례를 작성합니다
  • 이 테스트를 실행하지만 테스트 사례의 비즈니스 로직이 구현되지 않았기 때문에 이러한 테스트는 분명히 실패합니다
  • 구현 코드 세부 사항
  • 개발자가 코드를 성공적으로 구현하면 모든 테스트가 통과됩니다.
  • 비즈니스 코드를 적시에 리팩토링하세요. 새 코드 기능이 올바르지 않으면 해당 테스트 파일을 수정하세요. 실패할 수도 있습니다

새로운 기능을 개발해야 할 경우 위 단계를 반복하세요. 프로세스는 아래 그림에 나와 있습니다.

Ginkgo: BDD Go 언어 프레임워크

tdd-flowchart

더 흥미로운 Github 저장소가 있습니다: learn-go-with-tests, 이는 TDD를 학습하도록 설계되었습니다. Go를 통해.

BDD

TDD는 개발에 중점을 두고 테스트 사례를 사용하여 개발자가 더 높은 품질과 더 적은 버그가 있는 코드를 작성하도록 규제하고 제한합니다. BDD는 테스트 사례를 디자인할 때 시스템을 정의해야 하는 디자인에 더 중점을 두고, 공통 언어를 사용하여 시스템의 동작을 설명하고, 시스템 디자인과 테스트 사례를 결합하여 개발 작업을 추진하는 것을 옹호합니다.

BDD는 TDD에서 파생되었습니다. 가장 큰 차이점은 테스트 설명에 있습니다. BDD는 실제 결과보다는 필요한 기능에 더 초점을 맞춰 테스트 사례를 설명하기 위해 보다 이해하기 쉬운 언어를 사용합니다.

BDD가 테스트를 문장처럼 읽어주는 능력은 테스트에 대한 인식의 변화를 가져오고 테스트를 더 잘 작성하는 방법에 대해 생각하는 데 도움이 됩니다.

Ginkgo

Ginkgo는 개발자가 표현적이고 포괄적인 테스트를 작성할 수 있도록 설계된 Go 언어의 BDD 테스트 프레임워크입니다.

Ginkgo는 Go의 기본 <code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background: rgba(14, 210, 247, 0.15);'><span style="font-size: 15px;">testing</span> 库,这意味着你可以通过 <span style="font-size: 15px;">go test</span> 来运行 Ginkgo 测试套件。同时,它与断言和 mock 套件 testify 、富测试集 go-check 同样兼容。但 Ginkgo 建议的是搭配 gomega 库一起使用。

下面,我们使用 Ginkgo 来感受一下 BDD 模式的测试代码。

下载

使用 <span style="font-size: 15px;">go get</span>testing 라이브러리 즉,

🎜go test🎜 🎜 실행 은행나무 테스트 스위트. 동시에, 어설션 및 모의 스위트 🎜🎜testify🎜🎜 및 풍부한 테스트 스위트 🎜🎜go-check🎜🎜과도 호환됩니다. 하지만 Ginkgo가 추천하는 것은 🎜🎜gomega🎜🎜 라이브러리와 함께 사용하는 것입니다. 🎜🎜🎜🎜 다음으로 Ginkgo를 사용하여 BDD 모드의 테스트 코드를 체험해보겠습니다. 🎜🎜
다운로드
🎜🎜사용🎜🎜go get🎜🎜 get🎜🎜
$ go get github.com/onsi/ginkgo/ginkgo
$ go get github.com/onsi/gomega/...

该命令获取 은행나무 并安装 <code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background: rgba(14, 210, 247, 0.15);'><span style="font-size: 15px;">ginkgo</span> 可执行文件到 <span style="font-size: 15px;">$GOPATH/bin</span>

创建套件

创建 gopher 库

$ cd path-to-package/gopher

<span style="font-size: 15px;">gopher.go</span> 文件中,有 <span style="font-size: 15px;">Gopher</span> 结构体与校验方法 <span style="font-size: 15px;">Validate</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
}

我们通过 <span style="font-size: 15px;">ginkgo bootstrap</span> 命令,来初始化一个 Ginkgo 测试套件。

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

此时在 <span style="font-size: 15px;">gopher.go</span> 同级目录中,生成了 <span style="font-size: 15px;">gopher_suite_test.go</span>ginkgo可执行文件到

🎜$GOPATH/bin🎜🎜 。🎜 🎜
创建套件
🎜🎜创建 gopher 库🎜🎜
package gopher_test

import (
 "testing"

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

func TestGopher(t *testing.T) {
 RegisterFailHandler(Fail)
 RunSpecs(t, "Gopher Suite")
}
🎜 🎜재 🎜🎜gopher.go🎜🎜 文件中,유 🎜 🎜Gopher🎜🎜 结构体与校验方法 🎜🎜Validate🎜🎜 如下🎜🎜
 $ 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
🎜🎜我们communica 🎜🎜은행나무 부트스트랩🎜🎜 命令,来初始化一个 은행나무 测试套件。🎜🎜
 $ ginkgo generate gopher
Generating ginkgo test for Gopher in:
  gopher_test.go
🎜 🎜此时재 🎜🎜gopher.go🎜🎜 同级目录中,生成了 🎜🎜gopher_suite_test.go🎜🎜 文件,内容如下🎜🎜
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><code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background: rgba(14, 210, 247, 0.15);'><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를 사용할 때 실행 수명 주기를 이해해야 합니다. 핵심 사항은 다음과 같습니다. <code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background: rgba(14, 210, 247, 0.15);'><span style="font-size: 15px;">It、Context、Describe、BeforeEach、AfterEach、JustBeforeEach、BeforeSuite、AfterSuite、By、Fail</span>It, Context, explain, BeforeEach, AfterEach, JustBeforeEach, BeforeSuite, AfterSuite, By, Fail 이러한 모듈의 실행 순서와 의미론적 논리입니다.

Ginkgo에는 비동기 테스트, 벤치마크 테스트, 지속적인 통합 및 기타 강력한 지원 등 이 기사에서 다루지 않은 많은 기능이 있습니다. 해당 창고는 https://github.com/onsi/ginkgo에 있습니다. 또한 독자는 Ginkgo에 대해 더 자세히 알아볼 수 있는 영어 및 중국어 버전도 제공합니다.

마지막으로 Ginkgo 프레임워크는 K8s 프로젝트에서도 학습할 가치가 있는 엔드투엔드(E2E) 테스트 사례를 작성하는 데 사용됩니다.

🎜

위 내용은 Ginkgo: BDD Go 언어 프레임워크의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제