SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Go初心者が標準パッケージから学んだテス
トの手法

Go Conference’20 in Autumn SENDAI

黒瀬祐平

自己紹介

● 黒瀬 祐平

○ 株式会社 TVer Technologies 

○ データエンジニア

■ データ処理基盤の開発・運用・保守を担当 

■ Go初心者

○ 趣味: 電子工作

■ M5Stackに興味があります 

TVer Technologiesについて

● TVerを提供しているTVer社の子会社です。

● TV番組と連動するシステムの開発やデータソリューションの提供を行っています。

● 弊社では、視聴データを変換したりDWHに格納したりするETL処理にGoを利用して
います。

TV 局
視聴データ 分析結果
イントロ

Goと出会ってから

● ETL処理のテストを実装するにあたって参考にした資料

○ 書籍

■ 松木雅幸, mattn, 藤原俊一郎, 中島大一, 上田拓也, 牧大輔, 鈴木健太. “改訂2版 みんなの
Go言語”, 技術評論社, 2019, 224p. 

■ Mat Ryer, 鵜飼 文敏, 牧野 聡. “Go言語によるWebアプリケーション開発”, オライリー・ジャパ
ン, 2016, 280p.

○ Effective Go(日本語版) 

○ 標準パッケージのソースコード 

○ その他Webの記事など 

http://go.shibu.jp/effective_go.html
https://gihyo.jp/book/2019/978-4-297-10727-7
https://www.oreilly.co.jp/books/9784873117522/
標準パッケージから学んだテストの手法

● ①Exampleテストの配置方法

● ②プロセス自体が終了するテストの方法

● ③テストで循環参照を避ける方法

①Exampleテストの配置方法

①Exampleテストの配置方法

②プロセス自体が終了するテストの方法

③テストで循環参照を避ける方法



①Exampleテストの配置方法


 ● Exampleテスト

○ パッケージのドキュメントに実行例として表示
されるコードの例

○ Exampleという文字列で始まる関数として定義
する

○ テスト実行時にテストの一部として実行される

package stringutil_test
import (
"fmt"
"github.com/golang/example/stringutil"
)
func ExampleReverse() {
fmt.Println(stringutil.Reverse("hello"))
// Output: olleh
}
https://blog.golang.org/examples
①Exampleテストの配置方法

● golang-standards/project-layoutのリポジトリ
構成例

○ examples/に実行例を置く

○ ここの実行例はExampleテストではないため
関数名がExampleという名前から始まっていな
い

リポジトリのroot
├── api/
├── assets/
├── build/
├── cmd/
├── configs/
├── deployments/
├── docs/
├── examples/
├── githooks/
├── init/
├── internal/
├── pkg/
<以下省略>
https://github.com/golang-standards/project-layout
https://github.com/nats-io/nats.go/blob/master/examples/nats-echo/main.go
①Exampleテストの配置方法

● 標準パッケージの方法 

○ 基本的に各パッケージのコードと同じパスに
example_test.goというファイルを配置し、その
中にExampleテストを書いている

// go/src/log/example_test.goから抜粋
package log_test
import (
"bytes"
"fmt"
"log"
)
func ExampleLogger() {
<省略>
logger.Print("Hello, log file!")
fmt.Print(&buf)
// Output:
// logger: example_test.go:19: Hello, log file!
}
https://github.com/golang/go/blob/master/src/log/example_test.go
②プロセス自体が終了するテストの方法



①Exampleテストの配置方法

②プロセス自体が終了するテストの方法

③テストで循環参照を避ける方法





②プロセス自体が終了するテストの方法

● プロセス自体が終了してしまう関数をテスト
しようとすると、普通に呼び出すだけではテ
ストも途中で止まってしまう 

// サンプル
func Foo(){
os.Exit(42)
}
func TestFoo(t *testing.T){
<省略>
Foo()
<省略>
}
②プロセス自体が終了するテストの方法

● 標準パッケージでは、自分自身を環境変数
付きでexec.Commandで呼び出している 

○ 指定された環境変数が設定されている場合
はその関数を実行する

○ 直接テストが実行された場合はその関数をス
キップする

○ os/execやos/pipe, net/httpなどのパッケージ
で使われている

● panicをテストする時も同じ方法を使える 

○ testingパッケージで使われている

func TestFoo(t *testing.T) {
cmd := exec.Command(os.Args[0],
"-test.run=TestHelperProcess")
cmd.Env = append(os.Environ(),
"GO_WANT_HELPER_PROCESS=1")
cmd.Run()
want := 42
got := cmd.ProcessState.ExitCode()
if want != got {
t.Errorf(“ExitCode got %d, want %d”,
got, want)
}
}
func TestHelperProcess(t *testing.T) {
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
return
}
Foo()
}
③テストで循環参照を避ける方法

①Exampleテストの配置方法

②プロセス自体が終了するテストの方法

③テストで循環参照を避ける方法



③テストで循環参照を避ける方法

● テストで使うパッケージ内でテスト対象自身
がインポートされていると循環参照になりコ
ンパイルエラーになる 

● 別のテストパッケージを定義してそこからイ
ンポートする

● 標準パッケージでは、テスト対象のパッケー
ジ名を.にしてimportしている 

○ fmtやioなどで利用されている手法

○ .としてインポートするまっとうな理由がある数
少ない例

// go/src/fmt/fmt_test.goから抜粋
package fmt_test
import (
<省略>
. “fmt”
“internal/race”
“testing”
<省略>
)
http://go.shibu.jp/effective_go.html#id7
https://youtu.be/ndmB0bj7eyw?t=2581
結論

結論

● 学んだこと

○ 手法について

■ ①Exampleテストの配置方法 

■ ②プロセス自体が終了するテストの方法 

■ ③テストで循環参照を避ける方法 

○ 情報源について

■ 標準パッケージのコードには参考になる例がたくさんあり、一見の価値あり 

Innovate TVision
We are hiring
TVer Technologies

Weitere ähnliche Inhalte

Ähnlich wie Go初心者が標準パッケージから学んだテストの手法

カスタマーサクセスのためのデータ整備人の活動記録
カスタマーサクセスのためのデータ整備人の活動記録カスタマーサクセスのためのデータ整備人の活動記録
カスタマーサクセスのためのデータ整備人の活動記録syou6162
 
MonotaRO のデータ活用と基盤の過去、現在、未来
MonotaRO のデータ活用と基盤の過去、現在、未来 MonotaRO のデータ活用と基盤の過去、現在、未来
MonotaRO のデータ活用と基盤の過去、現在、未来 株式会社MonotaRO Tech Team
 
Oracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始めOracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始めSatoshi Nagayasu
 
はじめてのテスト技法
はじめてのテスト技法はじめてのテスト技法
はじめてのテスト技法Tatsuya Saito
 
ChainerでDeep Learningを試す為に必要なこと
ChainerでDeep Learningを試す為に必要なことChainerでDeep Learningを試す為に必要なこと
ChainerでDeep Learningを試す為に必要なことJiro Nishitoba
 
品質APIの紹介とniconicoでの活用事例
品質APIの紹介とniconicoでの活用事例品質APIの紹介とniconicoでの活用事例
品質APIの紹介とniconicoでの活用事例TakutoKimura2357
 
オープンセミナー岡山 これから始めるデータ活用
オープンセミナー岡山 これから始めるデータ活用オープンセミナー岡山 これから始めるデータ活用
オープンセミナー岡山 これから始めるデータ活用syou6162
 
Call for Speakersに講演を256倍通す方法
Call for Speakersに講演を256倍通す方法Call for Speakersに講演を256倍通す方法
Call for Speakersに講演を256倍通す方法Kentaro Takeda
 
佐賀大学 - データ分析と向き合う
佐賀大学 - データ分析と向き合う佐賀大学 - データ分析と向き合う
佐賀大学 - データ分析と向き合うDaiyu Hatakeyama
 
ノーツが日本を救う(2002/3/13)
ノーツが日本を救う(2002/3/13)ノーツが日本を救う(2002/3/13)
ノーツが日本を救う(2002/3/13)伸夫 森本
 
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」Hiroyuki Ohnaka
 
PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」
PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」
PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」PC Cluster Consortium
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱Koichi ITO
 
ChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことRetrieva inc.
 
人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~
人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~
人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~Rakuten Group, Inc.
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022Takayuki Shimizukawa
 
Photon Enterprise Cloud 事例
Photon Enterprise Cloud 事例Photon Enterprise Cloud 事例
Photon Enterprise Cloud 事例Tomotsune Murata
 
ITSP_JTUG_2210_SponsorSession.pdf
ITSP_JTUG_2210_SponsorSession.pdfITSP_JTUG_2210_SponsorSession.pdf
ITSP_JTUG_2210_SponsorSession.pdfINTAGEGROUP
 
KLabのエンジニアを支えるカルチャー
KLabのエンジニアを支えるカルチャーKLabのエンジニアを支えるカルチャー
KLabのエンジニアを支えるカルチャーKLab Inc. / Tech
 

Ähnlich wie Go初心者が標準パッケージから学んだテストの手法 (20)

オープンソースで開くビッグデータの扉
オープンソースで開くビッグデータの扉オープンソースで開くビッグデータの扉
オープンソースで開くビッグデータの扉
 
カスタマーサクセスのためのデータ整備人の活動記録
カスタマーサクセスのためのデータ整備人の活動記録カスタマーサクセスのためのデータ整備人の活動記録
カスタマーサクセスのためのデータ整備人の活動記録
 
MonotaRO のデータ活用と基盤の過去、現在、未来
MonotaRO のデータ活用と基盤の過去、現在、未来 MonotaRO のデータ活用と基盤の過去、現在、未来
MonotaRO のデータ活用と基盤の過去、現在、未来
 
Oracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始めOracle対応アプリケーションのDockerize事始め
Oracle対応アプリケーションのDockerize事始め
 
はじめてのテスト技法
はじめてのテスト技法はじめてのテスト技法
はじめてのテスト技法
 
ChainerでDeep Learningを試す為に必要なこと
ChainerでDeep Learningを試す為に必要なことChainerでDeep Learningを試す為に必要なこと
ChainerでDeep Learningを試す為に必要なこと
 
品質APIの紹介とniconicoでの活用事例
品質APIの紹介とniconicoでの活用事例品質APIの紹介とniconicoでの活用事例
品質APIの紹介とniconicoでの活用事例
 
オープンセミナー岡山 これから始めるデータ活用
オープンセミナー岡山 これから始めるデータ活用オープンセミナー岡山 これから始めるデータ活用
オープンセミナー岡山 これから始めるデータ活用
 
Call for Speakersに講演を256倍通す方法
Call for Speakersに講演を256倍通す方法Call for Speakersに講演を256倍通す方法
Call for Speakersに講演を256倍通す方法
 
佐賀大学 - データ分析と向き合う
佐賀大学 - データ分析と向き合う佐賀大学 - データ分析と向き合う
佐賀大学 - データ分析と向き合う
 
ノーツが日本を救う(2002/3/13)
ノーツが日本を救う(2002/3/13)ノーツが日本を救う(2002/3/13)
ノーツが日本を救う(2002/3/13)
 
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
 
PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」
PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」
PCCC21:株式会社日立製作所 「研究開発力向上のための研究DXソリューション」
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
ChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なこと
 
人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~
人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~
人工知能に任せないと難しい時代、何をどうやるべきか~楽天のAI技術活用から人材育成まで~
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
 
Photon Enterprise Cloud 事例
Photon Enterprise Cloud 事例Photon Enterprise Cloud 事例
Photon Enterprise Cloud 事例
 
ITSP_JTUG_2210_SponsorSession.pdf
ITSP_JTUG_2210_SponsorSession.pdfITSP_JTUG_2210_SponsorSession.pdf
ITSP_JTUG_2210_SponsorSession.pdf
 
KLabのエンジニアを支えるカルチャー
KLabのエンジニアを支えるカルチャーKLabのエンジニアを支えるカルチャー
KLabのエンジニアを支えるカルチャー
 

Go初心者が標準パッケージから学んだテストの手法