SlideShare a Scribd company logo
1 of 21
GoでUnit Testをやってみた
Go言語とReactで考える
Webアプリの「いい感じなURL設計」
入門
自己紹介
• 矢納正浩(ヤノウマサヒロ)
– (株)zabuton
– 平成5年生まれ、社会人4年目
– Java, Python, Go, Angular 1系, React
• 新規サービス開発をしてます!
• バレーボールやってます!
目標達成を支援するクラウドサービス
• 明確なゴールがない
• ゴールが共有されてな
い
• ゴールに向かってない
• 達成度が見えない
• 自律型組織が進まない https://info.zealup.jp
これらの
問題を
解決
https://info.zealup.jp
https://info.zealup.jp
Router
Middleware
Controller
Service
Database
Service
• Databaseとのやり取りのレイヤー
• Couchbaseを使用
– NoSQL
– 1ms以下のレイテンシ
– 個人的に好き
• とは違うDBです(^_^;)
type UserService interface {
GetUserByEmail(email string) (*entity.User, error)
}
type UserServiceImpl struct {}
func (_ UserServiceImpl) GetUserByEmail(email string) (*entity.User, error) {
var params []interface{}
params = append(params, email)
query := db.NewN1QLQuery("select * from sample where email=$1")
rows, _ := db.GetBucket().ExecuteN1qlQuery(query, params)
var row map[string]*entity.User
rows.One(&row)
return row["sample"], nil
}
import (
"github.com/stretchr/testify/assert"
"testing"
)
func init() {
before()
}
func TestGetUserByEmail_success_to_get(t *testing.T) {
sut := UserServiceImpl{}
user, err := sut.GetUserByEmail("yanou@zabuton.co.jp")
if err != nil {
assert.Fail(t, err.Error())
return
}
assert.Equal(t, "0904a8b4611d4ed757939c2593ba9da6", user.Id)
assert.Equal(t, "Yanou", user.Name)
assert.Equal(t, "yanou@zabuton.co.jp", user.Email)
}
func before() {
connectTestDatabase()
bucket := database.GetBucket()
opes := database.NewBulkOpes()
opes = append(removeOpes, db.NewRemoveOpe("user_0904a8"))
if err := bucket.Do(removeOpes); err != nil { panic(err) }
opes = database.NewBulkOpes()
opes = append(insertOpes, db.NewInsertOpe("user_0904a8", &entity.User{
Id: "0904a8",
Type: "user",
Name: "Yanou",
Email: "yanou@zabuton.co.jp",
}))
if err := bucket.Do(insertOpes); err != nil {
panic(err)
}
}
テスト用DBへの接続
テストデータの削除
テストデータの作成
func TestSaveTrackingList_success_to_save(t *testing.T) {
beforeMetaList()
// テスト対象実行
afterMetaList()
diffMetaList := diffMetaList()
// アサーション
}
テスト対象実行前のDB状態を取得
この際に ID と REV を取得
テスト対象実行後のDB状態を取得
この際に ID と REV を取得
上記ふたつの差分を習得
Controller
• リクエストの処理
• Serviceへのデータ渡し・受け取り
– Serviceはモックします
import (
"github.com/stretchr/testify/mock"
"jp.co.zabuton/service"
)
type MockCompanyService struct {
service.CompanyService
mock.Mock
}
func (m *MockCompanyService) GetCompany(id string) *entity.Company {
args := m.Called(id)
if args.Get(0) == nil {
return nil
} else {
return args.Get(0).(*entity.Company)
}
}
func TestGetCompanies_no_data(t *testing.T) {
mockCS := new(MockCompanyService)
mockCS.On("GetCompanies").Return([]entity.Company{}, nil)
SetCompanyService(mockCS)
r := createRequest("GET", "/companies", nil)
w := httptest.NewRecorder()
m.ServeHTTP(w, r)
assert.Equal(t, w.Code, http.StatusOK)
assert.Equal(t, "[]", string(w.Body.Bytes()))
}
テストカバレッジ
go test -coverprofile=cover.out service
go tool cover -html=cover.out
テストカバレッジ
go test -coverprofile=cover.out ${package}
複数のパッケージを同時に出すことができない
go test -coverprofile=cover.out service
go test -coverprofile=cover.out controller
go test -coverprofile=cover.out middleware
go test -coverprofile=cover.out util
じゃあ……
くっつけちゃいましょう!
export GOPATH=`pwd`
mkdir -p cover
rm -fr cover/*
packages=("controller" "service" "middleware")
for package in ${packages[@]}
do
go test -coverprofile=cover/${package}.out ${package}
done
for package in ${packages[@]}
do
go tool cover -html=cover/${package}.out -o=cover/${package}.html
done
./logmerge ${COVER_DIR}
open ${COVER_DIR}/merge.html
export GOPATH=`pwd`
mkdir -p cover
rm -fr cover/*
packages=("controller" "service" "middleware")
for package in ${packages[@]}
do
go test -coverprofile=cover/${package}.out jp.co.zabuton/time/${package}
done
for package in ${packages[@]}
do
go tool cover -html=cover/${package}.out -o=cover/${package}.html
done
./logmerge ${COVER_DIR}
open ${COVER_DIR}/merge.html ?
./logmerge ${COVER_DIR}
• つくりました
• 作成されたHTMLを解析
• selectboxの内容のマージ
• テスト対象のコードをマージ
• マージしたHTMLを出力
GoでUnit Testをやってみた
1st Product Zealup https://info.zealup.jp
矢納正浩
株式会社zabuton https://zabuton.co.jp

More Related Content

What's hot

What's hot (14)

20151205 中国地方db勉強会 dbm_fs
20151205 中国地方db勉強会 dbm_fs20151205 中国地方db勉強会 dbm_fs
20151205 中国地方db勉強会 dbm_fs
 
DrupalにおけるJSON:APIの注意点
DrupalにおけるJSON:APIの注意点DrupalにおけるJSON:APIの注意点
DrupalにおけるJSON:APIの注意点
 
DeNA×マネーフォワード×Wantedly Railsエンジニアセミナー
DeNA×マネーフォワード×Wantedly RailsエンジニアセミナーDeNA×マネーフォワード×Wantedly Railsエンジニアセミナー
DeNA×マネーフォワード×Wantedly Railsエンジニアセミナー
 
WebエンジニアがXR業界へ転職した話
WebエンジニアがXR業界へ転職した話WebエンジニアがXR業界へ転職した話
WebエンジニアがXR業界へ転職した話
 
「自分でやる」という快感を追い続ける - あるプログラマーの成長戦略 -
「自分でやる」という快感を追い続ける - あるプログラマーの成長戦略 -「自分でやる」という快感を追い続ける - あるプログラマーの成長戦略 -
「自分でやる」という快感を追い続ける - あるプログラマーの成長戦略 -
 
シェル芸勉強会へようこそ
シェル芸勉強会へようこそシェル芸勉強会へようこそ
シェル芸勉強会へようこそ
 
PostgreSQL JSON型と Facebook APIを使って webアプリ開発をした話
PostgreSQL JSON型と Facebook APIを使ってwebアプリ開発をした話PostgreSQL JSON型と Facebook APIを使ってwebアプリ開発をした話
PostgreSQL JSON型と Facebook APIを使って webアプリ開発をした話
 
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Sli.do入門
Sli.do入門Sli.do入門
Sli.do入門
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
 
Slido入門
Slido入門Slido入門
Slido入門
 
サーバーレスでアンケートフォームを作ってみた
サーバーレスでアンケートフォームを作ってみたサーバーレスでアンケートフォームを作ってみた
サーバーレスでアンケートフォームを作ってみた
 
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
 

Similar to Go で Unit Test をやってみた

20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた
Shugo Numano
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBase
kyon mm
 

Similar to Go で Unit Test をやってみた (20)

オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
 
ソフトウェア開発の現場風景
ソフトウェア開発の現場風景ソフトウェア開発の現場風景
ソフトウェア開発の現場風景
 
第八回 #渋谷Java 最近のjava PaaS事情
第八回 #渋谷Java 最近のjava PaaS事情第八回 #渋谷Java 最近のjava PaaS事情
第八回 #渋谷Java 最近のjava PaaS事情
 
20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた20120702勉強会 webアプリ作ってみた
20120702勉強会 webアプリ作ってみた
 
Web development fundamental_v2
Web development fundamental_v2Web development fundamental_v2
Web development fundamental_v2
 
リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version
 
Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminar
 
Sprocketsを捨てたい
Sprocketsを捨てたいSprocketsを捨てたい
Sprocketsを捨てたい
 
ひよこテスト駆動開発(PHPカンファレンス2014)
ひよこテスト駆動開発(PHPカンファレンス2014)ひよこテスト駆動開発(PHPカンファレンス2014)
ひよこテスト駆動開発(PHPカンファレンス2014)
 
「Agileごっこ」で終わらせないために(仮)
「Agileごっこ」で終わらせないために(仮) 「Agileごっこ」で終わらせないために(仮)
「Agileごっこ」で終わらせないために(仮)
 
サイボウズのオープンソースへの取り組み - OSC 2018 Osaka
サイボウズのオープンソースへの取り組み - OSC 2018 Osakaサイボウズのオープンソースへの取り組み - OSC 2018 Osaka
サイボウズのオープンソースへの取り組み - OSC 2018 Osaka
 
ゲーム会社で
ゲーム以外のことを開発してる話
ゲーム会社で
ゲーム以外のことを開発してる話ゲーム会社で
ゲーム以外のことを開発してる話
ゲーム会社で
ゲーム以外のことを開発してる話
 
Goでのチーム開発とコード管理の悩み
Goでのチーム開発とコード管理の悩みGoでのチーム開発とコード管理の悩み
Goでのチーム開発とコード管理の悩み
 
Static Web AppsとBlazor WebAssemblyのすすめ
Static Web AppsとBlazor  WebAssemblyのすすめStatic Web AppsとBlazor  WebAssemblyのすすめ
Static Web AppsとBlazor WebAssemblyのすすめ
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBase
 
Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~
 
お安く、楽にWEBアプリを支える技術
お安く、楽にWEBアプリを支える技術お安く、楽にWEBアプリを支える技術
お安く、楽にWEBアプリを支える技術
 
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
 
TypeScript x Bot Framework
TypeScript x Bot FrameworkTypeScript x Bot Framework
TypeScript x Bot Framework
 

Go で Unit Test をやってみた