SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
Copyright Drecom Co., Ltd. All Rights Reserved. 1
こんな辛い(?)テストはイヤだ!!
三上 拓也
Copyright Drecom Co., Ltd. All Rights Reserved. 2
自己紹介
⁃ 三上 拓也 (@mkmn252)
⁃ 所属
⁃ 株式会社ドリコム
⁃ 2015年度新卒入社
⁃ 仕事内容
⁃ ネイティブゲームアプリの
サーバーサイドエンジニア
Copyright Drecom Co., Ltd. All Rights Reserved. 3
ざっくり趣味とか
Copyright Drecom Co., Ltd. All Rights Reserved. 4
ざっくり趣味とか
※ 赤枠が行った公演
Copyright Drecom Co., Ltd. All Rights Reserved. 5
ざっくり趣味とか
地獄めぐりしてきました
Copyright Drecom Co., Ltd. All Rights Reserved. 6
閑話休題
Copyright Drecom Co., Ltd. All Rights Reserved. 7
前置き
⁃ 所属するPJにおいて、Ruby/Railsのバー
ジョンアップを実行した
⁃ Ruby: 2.1.5 -> 2.3.1
⁃ Rails: 4.0.13 -> 4.2.7.1
⁃ テストが充実していて作業に安心できる
⁃ 大抵のコードを網羅している
⁃ バージョンアップ後のチェックがしやすい
⁃ (実機確認もするが)安心できる
Copyright Drecom Co., Ltd. All Rights Reserved. 8
ただ、テストの書き方が悪く、
テストしたい部分の前でつまずく or
テスト自体がコケることも・・・
Copyright Drecom Co., Ltd. All Rights Reserved. 9
本日の内容:
最近出会った
辛い(?)テストたち
Copyright Drecom Co., Ltd. All Rights Reserved. 10
今回紹介する辛いテスト
1. よくあるやつ
2. 文字列比較
3. ディレクトリ指定
Copyright Drecom Co., Ltd. All Rights Reserved. 11
1. よくあるやつ
Copyright Drecom Co., Ltd. All Rights Reserved. 12
1. よくあるやつ
⁃ 最初はテスト通る
$ rspec spec/models/skill_spec.rb
.....................................................................................................
Finished in 8.57 seconds (files took 8.64 seconds to load)
101 examples, 0 failures
$ rspec spec/models/skill_spec.rb
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Finished in 8.57 seconds (files took 8.64 seconds to load)
101 examples, 101 failures
⁃ 突然テストが通らなくなる
Copyright Drecom Co., Ltd. All Rights Reserved. 13
1. よくあるやつ
なぜコケるの??
# エラー出力
Failure/Error: FactoryGirl.create(:skill, id: i) unless Skill.exists?(id: i)
ActiveRecord::RecordNotUnique:
Mysql2::Error: Duplicate entry '1' for key 'PRIMARY': INSERT INTO `skills` (`id`,
`created_at`, `updated_at`) VALUES (1, '2017-01-26 01:14:33', '2017-01-26 01:14:33') :
master
_人人人人人人人人人人人人人人人人_
> Primary KeyのDuplicate entry <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
Copyright Drecom Co., Ltd. All Rights Reserved. 14
1. よくあるやつ
原因
⁃ データが論理削除されてた
before(:all) do
# 参照されるので予めデータを作成する
(1..10).each do |i|
FactoryGirl.create(:skill, id: i) unless Skill.exists?(id: i)
end
End
after(:all)
(1..10).each { |i| Skill.find_by(id: i).try(:destroy!) }
end
Copyright Drecom Co., Ltd. All Rights Reserved. 15
1. よくあるやつ
対処方法
⁃ FactoryGirlでのid指定createはやめるべ
き
⁃ どうしても必要なら、afterで確実に消し去
る
Copyright Drecom Co., Ltd. All Rights Reserved. 16
2. 文字列比較
Copyright Drecom Co., Ltd. All Rights Reserved. 17
2. 文字列比較
管理画面などのView
⁃ 出力されるHTML(imgタグ)のテストがある
$ rspec spec/helpers/output_html_tag_helper_spec.rb
F..................F.
Finished in 0.87774 seconds (files took 12.25 seconds to load)
21 examples, 2 failures
Failed examples:
rspec ./spec/helpers/output_html_tag_helper_spec.rb:37 #
OutputHtmlTagHelper.character_image_tag generate img tag of character
rspec ./spec/helpers/output_html_tag_helper_spec.rb:5 # OutputHtmlTagHelper.link_tag make
IMG tag to example.com
Copyright Drecom Co., Ltd. All Rights Reserved. 18
2. 文字列比較
原因
⁃ 出力される属性の順番が変わった
Expected:
<img alt=“character” class=“character class_a” src=“http://example.com/character.png” width=“540’ />
Got:
<img width=“540” alt=“character” class=“character class_a” src=“http://example.com/character.png” />
# テストコード
describe “.character_image_tag” do
it “character_image_tag generate img tag of character” do
expect(helper.character_image_tag(20).to eq ¥
’<img alt=“character” class=“character class_a” src=“http://example.com/character.png”
width=“540” />’
end
end
# テスト結果
Copyright Drecom Co., Ltd. All Rights Reserved. 19
2. 文字列比較
対処方法
⁃ Nokogiriでゴリゴリ頑張る
⁃ rspec-html-matchers
⁃ テスト捨てる
⁃ → 結果捨てました
Copyright Drecom Co., Ltd. All Rights Reserved. 20
3. ディレクトリ指定
Copyright Drecom Co., Ltd. All Rights Reserved. 21
3. ディレクトリ指定
同PJの別のレポジトリにて・・・
⁃ あわせてrubyのver.upしようと修正した
(´・ω・`)
_(__つ/ ̄ ̄ ̄/_
\/ /
修正完了したし、
テスト実行するか・・・(ポチ
Copyright Drecom Co., Ltd. All Rights Reserved. 22
3. ディレクトリ指定
$ rspec
.......................
create file_1
create file_2
create file_3
create file_4
create file_5
create file_6
create file_7
create file_8
create file_9
(中略 数千行)
Finished in 13 minutes 46 seconds (files took 0.56944 seconds to load)
95 examples, 0 failures
_人人人人人人人人人人人人人人_
> 大量のファイル生成ログ <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
※ 別ディレクトリを参照して別ファイルを生成するスクリプトのテスト実行時
Copyright Drecom Co., Ltd. All Rights Reserved. 23
3. ディレクトリ指定
(´・ω・`)
_( つ ミ バタンッ
\ ̄ ̄ ̄\ミ
 ̄ ̄ ̄ ̄
(´・ω・`)
_( )
\ ̄ ̄ ̄\
 ̄ ̄ ̄ ̄
Copyright Drecom Co., Ltd. All Rights Reserved. 24
3. ディレクトリ指定
原因
⁃ ローカルの別のディレクトリを参照していた
対処方法
⁃ spec/dummyを作ろう
# テストは../other-directoryが存在することを前提に書かれています
raise “../other-directory is not exists!” unless Dir.exist?(“../other-directory”)
Copyright Drecom Co., Ltd. All Rights Reserved. 25
まとめ
機能変更 or 追加してないのに、
テストコードの修正が(極力)ないように
テストを書こう
Copyright Drecom Co., Ltd. All Rights Reserved. 26
(余談)個人的もっと使われるべきと思うもの
⁃ FactoryGirl.create_list
⁃ 複数データ一括で作りたいなら便利
⁃ Rspec change matcher
⁃ 値の変化チェックにはもってこい
Copyright Drecom Co., Ltd. All Rights Reserved. 27
おわり

Contenu connexe

Tendances

Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 
UnitTestは最もTDDしやすいか否か? #TDDMeetUp
UnitTestは最もTDDしやすいか否か? #TDDMeetUpUnitTestは最もTDDしやすいか否か? #TDDMeetUp
UnitTestは最もTDDしやすいか否か? #TDDMeetUpkyon mm
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 虎の穴 開発室
 
隕石という名のスクリーンショットをSlackに落下させる話
隕石という名のスクリーンショットをSlackに落下させる話隕石という名のスクリーンショットをSlackに落下させる話
隕石という名のスクリーンショットをSlackに落下させる話Shinobu Okano
 
Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Tsunenori Oohara
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMKoichi Sakata
 
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜Kentaro Matsumae
 

Tendances (10)

Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
AWS Proton を使ってみた
AWS Proton を使ってみたAWS Proton を使ってみた
AWS Proton を使ってみた
 
GitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼうGitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼう
 
UnitTestは最もTDDしやすいか否か? #TDDMeetUp
UnitTestは最もTDDしやすいか否か? #TDDMeetUpUnitTestは最もTDDしやすいか否か? #TDDMeetUp
UnitTestは最もTDDしやすいか否か? #TDDMeetUp
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
隕石という名のスクリーンショットをSlackに落下させる話
隕石という名のスクリーンショットをSlackに落下させる話隕石という名のスクリーンショットをSlackに落下させる話
隕石という名のスクリーンショットをSlackに落下させる話
 
Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVM
 
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
iOSレガシーコード改善ガイド〜マンガボックス開発における事例〜
 

Similaire à こんな辛いテストはいやだ

「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)Drecom Co., Ltd.
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as codeYosuke Hiraishi
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムGo Sueyoshi (a.k.a sue445)
 
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたDrecom Co., Ltd.
 
プライベートクラウド作ってみました
プライベートクラウド作ってみましたプライベートクラウド作ってみました
プライベートクラウド作ってみましたKoji Hasebe
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”Drecom Co., Ltd.
 
DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方dena_study
 
5minQues - SWET近況報告
5minQues - SWET近況報告5minQues - SWET近況報告
5minQues - SWET近況報告Masaki Nakagawa
 
Cloudera impala
Cloudera impalaCloudera impala
Cloudera impala外道 父
 
Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例
Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例
Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例外道 父
 
OSS強化学習向けゲーム環境の動向
OSS強化学習向けゲーム環境の動向OSS強化学習向けゲーム環境の動向
OSS強化学習向けゲーム環境の動向gree_tech
 
ニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirkojingharang
 
リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介
リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介
リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介Shinichiro Yoshida
 
最新ゲームを支える文言
最新ゲームを支える文言最新ゲームを支える文言
最新ゲームを支える文言miki koganei
 
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~Recruit Technologies
 
20211209 lt runtime_field
20211209 lt runtime_field20211209 lt runtime_field
20211209 lt runtime_fieldNomura Yuta
 
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2GREE/Art
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Makoto Haruyama
 

Similaire à こんな辛いテストはいやだ (20)

「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
 
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみた
 
プライベートクラウド作ってみました
プライベートクラウド作ってみましたプライベートクラウド作ってみました
プライベートクラウド作ってみました
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
 
DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方
 
5minQues - SWET近況報告
5minQues - SWET近況報告5minQues - SWET近況報告
5minQues - SWET近況報告
 
Cloudera impala
Cloudera impalaCloudera impala
Cloudera impala
 
Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例
Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例
Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例
 
OSS強化学習向けゲーム環境の動向
OSS強化学習向けゲーム環境の動向OSS強化学習向けゲーム環境の動向
OSS強化学習向けゲーム環境の動向
 
ニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixir
 
リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介
リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介
リアルタイム通信アプリはつくれる!『Red5 Media Server』の機能と事例のご紹介
 
最新ゲームを支える文言
最新ゲームを支える文言最新ゲームを支える文言
最新ゲームを支える文言
 
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
Rancherを活用した開発事例の紹介 ~Rancherのメリットと辛いところ~
 
20211209 lt runtime_field
20211209 lt runtime_field20211209 lt runtime_field
20211209 lt runtime_field
 
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
GCM#4 アーティストのためのプログラマブルシェーダー講座Part2
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介
 

Dernier

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Dernier (9)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

こんな辛いテストはいやだ

  • 1. Copyright Drecom Co., Ltd. All Rights Reserved. 1 こんな辛い(?)テストはイヤだ!! 三上 拓也
  • 2. Copyright Drecom Co., Ltd. All Rights Reserved. 2 自己紹介 ⁃ 三上 拓也 (@mkmn252) ⁃ 所属 ⁃ 株式会社ドリコム ⁃ 2015年度新卒入社 ⁃ 仕事内容 ⁃ ネイティブゲームアプリの サーバーサイドエンジニア
  • 3. Copyright Drecom Co., Ltd. All Rights Reserved. 3 ざっくり趣味とか
  • 4. Copyright Drecom Co., Ltd. All Rights Reserved. 4 ざっくり趣味とか ※ 赤枠が行った公演
  • 5. Copyright Drecom Co., Ltd. All Rights Reserved. 5 ざっくり趣味とか 地獄めぐりしてきました
  • 6. Copyright Drecom Co., Ltd. All Rights Reserved. 6 閑話休題
  • 7. Copyright Drecom Co., Ltd. All Rights Reserved. 7 前置き ⁃ 所属するPJにおいて、Ruby/Railsのバー ジョンアップを実行した ⁃ Ruby: 2.1.5 -> 2.3.1 ⁃ Rails: 4.0.13 -> 4.2.7.1 ⁃ テストが充実していて作業に安心できる ⁃ 大抵のコードを網羅している ⁃ バージョンアップ後のチェックがしやすい ⁃ (実機確認もするが)安心できる
  • 8. Copyright Drecom Co., Ltd. All Rights Reserved. 8 ただ、テストの書き方が悪く、 テストしたい部分の前でつまずく or テスト自体がコケることも・・・
  • 9. Copyright Drecom Co., Ltd. All Rights Reserved. 9 本日の内容: 最近出会った 辛い(?)テストたち
  • 10. Copyright Drecom Co., Ltd. All Rights Reserved. 10 今回紹介する辛いテスト 1. よくあるやつ 2. 文字列比較 3. ディレクトリ指定
  • 11. Copyright Drecom Co., Ltd. All Rights Reserved. 11 1. よくあるやつ
  • 12. Copyright Drecom Co., Ltd. All Rights Reserved. 12 1. よくあるやつ ⁃ 最初はテスト通る $ rspec spec/models/skill_spec.rb ..................................................................................................... Finished in 8.57 seconds (files took 8.64 seconds to load) 101 examples, 0 failures $ rspec spec/models/skill_spec.rb FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Finished in 8.57 seconds (files took 8.64 seconds to load) 101 examples, 101 failures ⁃ 突然テストが通らなくなる
  • 13. Copyright Drecom Co., Ltd. All Rights Reserved. 13 1. よくあるやつ なぜコケるの?? # エラー出力 Failure/Error: FactoryGirl.create(:skill, id: i) unless Skill.exists?(id: i) ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry '1' for key 'PRIMARY': INSERT INTO `skills` (`id`, `created_at`, `updated_at`) VALUES (1, '2017-01-26 01:14:33', '2017-01-26 01:14:33') : master _人人人人人人人人人人人人人人人人_ > Primary KeyのDuplicate entry <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
  • 14. Copyright Drecom Co., Ltd. All Rights Reserved. 14 1. よくあるやつ 原因 ⁃ データが論理削除されてた before(:all) do # 参照されるので予めデータを作成する (1..10).each do |i| FactoryGirl.create(:skill, id: i) unless Skill.exists?(id: i) end End after(:all) (1..10).each { |i| Skill.find_by(id: i).try(:destroy!) } end
  • 15. Copyright Drecom Co., Ltd. All Rights Reserved. 15 1. よくあるやつ 対処方法 ⁃ FactoryGirlでのid指定createはやめるべ き ⁃ どうしても必要なら、afterで確実に消し去 る
  • 16. Copyright Drecom Co., Ltd. All Rights Reserved. 16 2. 文字列比較
  • 17. Copyright Drecom Co., Ltd. All Rights Reserved. 17 2. 文字列比較 管理画面などのView ⁃ 出力されるHTML(imgタグ)のテストがある $ rspec spec/helpers/output_html_tag_helper_spec.rb F..................F. Finished in 0.87774 seconds (files took 12.25 seconds to load) 21 examples, 2 failures Failed examples: rspec ./spec/helpers/output_html_tag_helper_spec.rb:37 # OutputHtmlTagHelper.character_image_tag generate img tag of character rspec ./spec/helpers/output_html_tag_helper_spec.rb:5 # OutputHtmlTagHelper.link_tag make IMG tag to example.com
  • 18. Copyright Drecom Co., Ltd. All Rights Reserved. 18 2. 文字列比較 原因 ⁃ 出力される属性の順番が変わった Expected: <img alt=“character” class=“character class_a” src=“http://example.com/character.png” width=“540’ /> Got: <img width=“540” alt=“character” class=“character class_a” src=“http://example.com/character.png” /> # テストコード describe “.character_image_tag” do it “character_image_tag generate img tag of character” do expect(helper.character_image_tag(20).to eq ¥ ’<img alt=“character” class=“character class_a” src=“http://example.com/character.png” width=“540” />’ end end # テスト結果
  • 19. Copyright Drecom Co., Ltd. All Rights Reserved. 19 2. 文字列比較 対処方法 ⁃ Nokogiriでゴリゴリ頑張る ⁃ rspec-html-matchers ⁃ テスト捨てる ⁃ → 結果捨てました
  • 20. Copyright Drecom Co., Ltd. All Rights Reserved. 20 3. ディレクトリ指定
  • 21. Copyright Drecom Co., Ltd. All Rights Reserved. 21 3. ディレクトリ指定 同PJの別のレポジトリにて・・・ ⁃ あわせてrubyのver.upしようと修正した (´・ω・`) _(__つ/ ̄ ̄ ̄/_ \/ / 修正完了したし、 テスト実行するか・・・(ポチ
  • 22. Copyright Drecom Co., Ltd. All Rights Reserved. 22 3. ディレクトリ指定 $ rspec ....................... create file_1 create file_2 create file_3 create file_4 create file_5 create file_6 create file_7 create file_8 create file_9 (中略 数千行) Finished in 13 minutes 46 seconds (files took 0.56944 seconds to load) 95 examples, 0 failures _人人人人人人人人人人人人人人_ > 大量のファイル生成ログ <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄ ※ 別ディレクトリを参照して別ファイルを生成するスクリプトのテスト実行時
  • 23. Copyright Drecom Co., Ltd. All Rights Reserved. 23 3. ディレクトリ指定 (´・ω・`) _( つ ミ バタンッ \ ̄ ̄ ̄\ミ  ̄ ̄ ̄ ̄ (´・ω・`) _( ) \ ̄ ̄ ̄\  ̄ ̄ ̄ ̄
  • 24. Copyright Drecom Co., Ltd. All Rights Reserved. 24 3. ディレクトリ指定 原因 ⁃ ローカルの別のディレクトリを参照していた 対処方法 ⁃ spec/dummyを作ろう # テストは../other-directoryが存在することを前提に書かれています raise “../other-directory is not exists!” unless Dir.exist?(“../other-directory”)
  • 25. Copyright Drecom Co., Ltd. All Rights Reserved. 25 まとめ 機能変更 or 追加してないのに、 テストコードの修正が(極力)ないように テストを書こう
  • 26. Copyright Drecom Co., Ltd. All Rights Reserved. 26 (余談)個人的もっと使われるべきと思うもの ⁃ FactoryGirl.create_list ⁃ 複数データ一括で作りたいなら便利 ⁃ Rspec change matcher ⁃ 値の変化チェックにはもってこい
  • 27. Copyright Drecom Co., Ltd. All Rights Reserved. 27 おわり