Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Speee DEVELOPER BLOG

Speee開発陣による技術情報発信ブログです。 メディア開発・運用、スマートフォンアプリ開発、Webマーケティング、アドテクなどで培った技術ノウハウを発信していきます!

Speee内定者研修:gemにはテスト関連ファイルを含めなくてもよい

2025年4月入社予定の白戸 (ニックネーム: ユリタニ) です! 最近は,毎週30分入社前の研修*1を受けています. 内容としては,gemをリリースすることを通じて, red-data-tools/red-datastockを題材にRubyGemsの仕組みを学ぶという研修です. クリアコード須藤さんに説明をしてもらいながら実際に手を動かして学んでいます.

今回はその研修の中で学んだこととして,gemからの使用しないテスト関連ファイルの削除について説明します.

はじめに

この研修では,実際に手を動かして上記gemの改善しながら,gemの仕組みやOSS制作に必要な知識を学んでいます. 題材にしている red-datastock のディレクトリ内容を確認すると,下記のような構造になっていました.

red-datastock/
 ├ .github/
 ├ lib/
 ├ test/                      # 今回の変更対象1
 │    ├ helper.rb
 │    ├ run-test.rb
 │    └ test-downloader.rb
 ├ .gitignore
 ├ Gemfile
 ├ LICENSE.txt
 ├ README.md
 ├ Rakefile
 └ red-datastock.gemspec     # 今回の変更対象2

また,今回扱う red-datastock.gemspec であるred-datastock.gemspecは,以下のような形式になっていました.

# -*- ruby -*-

# (Gem::Specification内で使うラムダ式やパスの加工などを行う前処理部分)

require "datastock/version"

Gem::Specification.new do |spec|

  # (RubyGemsに掲載される情報.gem名や作者情報,バージョン情報など)
  spec.name = "red-datastock"
  ...

  # READMEファイルがどれであるかを示す記述.簡単な整形に関する記述も含んでいる
  readme = File.read("README.md")
  ...
  
  # このgemが採用しているライセンスのID
  spec.license = "MIT"

  # gem内に含めるファイルの一覧
  spec.files = [
    "README.md",
    "LICENSE.txt",
    "Rakefile",
    "Gemfile",
    "#{spec.name}.gemspec",
  ]
  spec.files += Dir.glob("lib/**/*.rb")
  spec.files += Dir.glob("image/*.*")
  # **この記述が必要なくなるため,削除の対象となる**
  spec.test_files += Dir.glob("test/**/*")

  # このgemの依存関係を示す部分
  spec.add_runtime_dependency("rubyzip")

  spec.add_development_dependency("bundler")
  ...
end

これらを見ると, test/ ディレクトリや,その参照を示す記述が .gemspec に存在することがわかります.

しかし,ここで「アプリ開発者は,普段使用しているgemに対するテストを行わないのではないか?」という疑問が生じます.つまり,このgemには使われないテスト用ファイルが含まれている,ということになります.

今は使われないテスト関連ファイルの削除

今回の変更は,gemのテストに関連するファイルとその参照情報を取り除く変更です. 具体的には,下記の2つを削除します.

  1. テストに使用するファイル群を削除
 ├ test/                      # 今回の変更対象1
 │    ├ helper.rb
 │    ├ run-test.rb
 │    └ test-downloader.rb
  1. テストのみで使用する依存関係を削除
  spec.test_files += Dir.glob("test/**/*")

テスト関連の内容を削除する理由

これらテスト関係のファイルを削除する理由は, gemのエンドユーザが必要としない余計なデータを含めないようにするためです.

ここでいうgemのエンドユーザは,「gemを利用するアプリケーション開発者」を指します.「このgem自体を開発する開発者」は含まれません.

歴史的経緯

かつてのgemには,インストール時からテスト関連のファイルが含まれていました.また,2010年ごろまでは,RubyGemsにはgemのインストール時にテストを行うオプションである gem install --test が存在しました.

しかし,多くのエンドユーザは,すでに出来上がったgemの動作をテストする必要性はなく,インストールしたgemを利用して自分のアプリケーションを実装するだけです.テスト用のファイルを必要とするようなgemの改善に参加するコントリビュータは,gemをインストールして開発するのではなくリポジトリ内のファイルを使って開発します.

このような経緯から,2011年に gem install --test を削除するコミット が入り,gem内のテストファイルがより使われにくくなりました.gem内にテストファイルを含める意義がほぼなくなり,また,テストファイルを含めないことでgemのファイルも小さくなることからgem内にテストファイルを含めないようになっていきました.

今後の改善

今回題材として使用している .gemspec ファイルには, spec.add_development_dependency(<gem名>) という記述があります.開発時のみに使用する依存関係を示すための記述ですが,これらの記述は,今は Gemfile に記述するため,今後の研修ではこの部分に関する改善を行う方針です.

まとめ

今回は,エンドユーザに必要のないテスト関連のファイルをgemから取り除いたという内容と,その歴史的経緯について説明しました.

普段何げなく開発する中では,使用しているライブラリーのテスト用ファイルを意識しません.この研修では,gemの開発者目線に立った時に,gemのエンドユーザにとって必要なものを意識して,時に今まであったものを削ることさえあるということを学ぶことができました.そして,そのことをコミュニティーに提起し・議論することがOSSの改善において重要であるということを学ぶことができたと思います.これからの研修も含めて,実際に仕事をする時に機動力を高められる知識・ノウハウをどんどん身につけていきたいと思います!

最後に

Speeeでは一緒にサービス開発を推進してくれる仲間を大募集しています。
新卒の方はこちらより本選考に申し込みが可能です。 キャリア採用の方はこちらのFormよりカジュアル面談も気軽にお申し込みいただけます。

Speeeでは様々なポジションで募集中なので「どんなポジションがあるの?」と気になってくれてた方は、こちらをチェックしてみてください!もちろんオープンポジション的に上記に限らず積極採用中です!

*1:Speeeでは内定してから入社するまでの間に内定者研修を実施しています。内定者研修は入社後にスムーズに業務に取り組むための基礎を身につけるために実施しています。プログラミング・データベース・チームでの開発方法などを網羅的にカバーしています。内定者の本業である学業がおろそかにならないようにバランスをとりながら実施しています。この記事で紹介している研修はあまり時間がない内定者向けの内容で、週に30分程度、より実践的な内容を手を動かしながら身につける研修です。