Home
Slides
Blog
slide.seike460.com
Home
Slides
Blog
Home
Slides
Fukuoka.go #14 + Umeda.go #2
Fukuoka.go #14 + Umeda.go #2
Fukuoka.go #14 + Umeda.go #2
2019年11月15日
Go
Go
Golang
Testing
Keyboard Shortcuts
←
→
Navigate slides
Space
Next slide
F
Fullscreen
ESC
Exit fullscreen
Home
First slide
End
Last slide
B
.
Pause
S
Speaker notes
?
Reveal.js help
Close
## Testing for AWS Serverless Go Fukuoka.go#14+Umeda.go 清家史郎(@seike460)
# Who? ###### Fusic Co., Ltd.  ###### 清家史郎 ([@seike460](https://twitter.com/seike460))  ###### Evangelist / Engineer ###### FullStack Backend (PHP、Go)
# OSS products - AWS Tools (Go) - [s3ry](https://github.com/seike460/s3ry) - S3 prompt cli - [utakata](https://github.com/seike460/utakata) - Serverless Slack iCal Notificator
# 今回お話する内容 - Goのテスト - クラウドリソースに関連するテスト
## Goのテスト
# Go Test 基礎 - Testing Package を利用する - Go標準提供のPackage - `XXX.go`のテストを作成時は`XXX_test.go`に記述する - `go test`で実行出来る - `go build`時はbuildされず、 `go test`時にbuildされる - テストデータ - テスト実行前にてテストデータを準備する(はず) - json等を用意したい場合`testdata`ディレクトリ`XXX.json.golden`をいれる - `testdata`ディレクトリ配下はBuildされない
# Go Test 実行イメージ テスト設定を読み込みデータを用意 ``` func init() { viper.SetConfigName("test") viper.AddConfigPath("$HOME") viper.AddConfigPath(".") viper.ReadInConfig() viper.SetDefault("debug", true) } func setup(db *gorm.DB) { log.Print("startup") db.CreateTable(&models.Accounts{}) db.CreateTable(&models.Members{}) insertData(db) log.Print("startup - end") } func teardown(db *gorm.DB) { log.Print("teardown") db.DropTable(&models.Accounts{}) db.DropTable(&models.Members{}) } ```
# Go Test 実行イメージ testing.M.Runにて実行 init -> TestMain ``` func TestMain(m *testing.M) { log.Print("TestMain Start") db, err := gorm.Open("mysql", viper.Get("db")) if err != nil { log.Fatal(err) } setup(db) // <-初期処理 code := m.Run() // <-実際の実行> teardown(db) <-後処理 log.Print("TestMain End") os.Exit(code) } ```
# Go Test 実行イメージ ``` seike460% go test ./... -v ``` ``` 2019/10/25 18:12:20 TestMain Start 2019/10/25 18:12:20 startup 2019/10/25 18:12:23 startup - end === RUN TestDaily ~ 省略 ~ --- PASS: TestCompletion (0.39s) PASS coverage: 34.3% of statements 2019/10/25 18:12:26 teardown 2019/10/25 18:12:26 TestMain End ok hoge/fuga/foo 6.273s coverage: 34.3% of statements ```
# テストのカバレッジも簡単 カバレッジ取得 ``` $ go test ./... -v -coverprofile=【カバレッジファイル名】 ``` カバレッジ描画 ``` $ go tool cover -html=【カバレッジファイル名】 ``` 僕はこんな感じにしてます ``` $ go test ./... -v -coverprofile=cover.out \ && go tool cover -html=cover.out \ && rm cover.out ```
# テストすべき場所も一目瞭然 
# 最高参考サイト [@budougumi0617](https://twitter.com/budougumi0617)さんの最高参考サイトがあった #### [My External Storage](https://budougumi0617.github.io) ##### [Goのtestを理解する in 2018 #go](https://budougumi0617.github.io/2018/08/19/go-testing2018/)
## クラウドリソースに対するテスト
# クラウドリソースに対するテストてどうやるの? - デプロイして目視確認 - 煩雑かつ時間がかかる - デプロイした環境に対してテストを書く - 修正コードをデプロイする時間がかかる - デプロイせず、ローカルでテスト - どうするべきか?
- Go単体で完結するテスト - testing Package単体でのテスト - クラウドリソースが必要な開発時のテスト - ツールを組み合わせてテスト
# 解決するツール ###### AWS SAM CLI ###### LocalStack
## AWS SAM CLI ###### AWS Serverless Application Model CloudFormationをサーバーレス用に拡張したツール - Lambda - API Gateway - DynamoDB
## AWS SAM CLI のローカル実行 seike460Functionを実行 ``` $ sam local invoke seike460Function --event event_file.json ``` localhostにAPI endpoint(Api Gateway)を作成 ``` $ sam local start-api ``` Lambdaのテスト用ローカルエンドポイントを準備 ``` $ sam local start-lambda ```
## LocalStack ローカルにAWSのモック/テスト環境を作ってくれてるツール docker-compose でサクッと立ち上がります ※Macの場合はTMPDIRを記述する必要あり ``` TMPDIR=/private$TMPDIR docker-compose up ``` [LocalStack がエラーで起動できない on Qiita](https://qiita.com/libra_lt/items/2e53ea1b523f8f9e089b)
## LocalStack ``` conf := &aws.Config{ Credentials: credentials.NewStaticCredentials("dumy", "dumy", ""), Region: "us-east-1", Endpoint: "http://localhost:4569", } sess, err := session.NewSession(conf) db := dynamo.New(sess) ```
# まとめ - Goのテストとして Testing Package はかなり便利 - クラウドリソースに対するテストがしたい! - クラウドリソースをローカルで再現出来るツールと組み合わせ
# 告知! ServerlessDays 2019 Fukuoka  - ServerlessDays 2019 Fukuoka - 12月13日 Workshop@天神一丁目最終調整中 - 12月14日 Conference@LINE Fukuoka https://www.papercall.io/slsdaysfukuoka2019
Thank you! We are Hiring!  https://fusic.github.io
Swipe to navigate
Previous
Next
Related Slides
Goでパイプライン
2023/1/1
View
Fukuoka.go #13 + Roppongi.go
2019/9/13
View
Fukuoka.go #12 + Tokyo.go
2019/7/12
View