SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Tendances

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

Tendances (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使ったのとその永続化についての話
 

Similaire à Go で Unit Test をやってみた

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

Similaire à 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 をやってみた