OpenAI Codexのおかげで、数時間でPyTestのFixturesをRubyに持ち込めた

2年くらい前に、「PyTestのFixturesみたいなのがRubyにあったらいいんだけどなー」と思ってsmartestというテストランナーを試作してたのだけど、時間もなくまともなAIもなく、結局リポジトリを作って数ファイルコミットして中途半端に何も出来上がっていない状態になっていた。

そもそも当時なんで独自のテストランナーが欲しくなったかと言うと、きっかけはPlaywright Test Runnerの紹介動画だ。

自動文字起こしのトランスクリプトだとこのように説明されている。

the big question is why did we create another yet another testing framework and honestly we did not want to um we tried them all. We tried Mocha, we tried the jest and the but it turned out that none of them really worked for us. And I think that the reason is that historically JavaScript test frameworks were built for unit testing but end to end testing has this unique set of challenges and we actually built playright test to address these challenges. So what are these challenges? Things like for example out of the box cross browser support. You don't need to set up any plugins or do any mess with the configuration. It just works. Parallelization for example, well, [clears throat] we know how to run things and how to reuse things in browser efficiently. So, we can run things really fast and so do isolation. Like in unit tests, you usually do isolation on the NodeJS side. And we can and we have to isolate test inside the browser. And there are way better ways to isolate things in browser. And uh last but not least, we actually want to have a crazy level of flexibility for our end to end tests and we were really impressed by pytest fixtures and we didn't see anything like that in JavaScript world. So we implemented these ideas of uh fixtures in JavaScript and in form of playright test.

雑に要約すると、

  • Playwrightテストは、べつに作りたくて作ったわけではなく、既存の単体テスト用のテストランナーではまったくフィットしなかったのでE2Eテストに特化したものを作ることにした。
  • PyTestのフィクスチャに感銘を受けて、既存のJavaScriptテストランナーでそれを実装したものがなかったので取り入れた

と説明されている。ちなみに2026年現在においてはVitestのcontextがあるが、これはPlaywrightが由来っぽいことが明記されている。

Test Context | Guide | Vitest

Test Context Inspired by Playwright Fixtures, Vitest's test context allows you to define utils, states, and fixtures that can be used in your tests.

Railsを本業にテストを書いている人は、RSpecもしくはMinitest+Capybaraで不安定なテストを書いている。これはおそらく10年くらい変わっていない。そうなると、このPlaywrightの取り組みはかなりゲームチェンジになるのでは?とおもってテストランナーを作ってみたいと思ったわけだ。

ChatGPTに雑に聞いてみた

2年くらい停滞していたテストランナー開発について、GPT-5.5が登場してさらに賢くなったなーという実感があったので、なんとなくChatGPTに聞いてみた。

  • Vitestのtest-contextやpytestのfixturesのようにブロック引数でフィクスチャを与えるような書き方ができる
  • describeやcontextを必須とせずトップレベルでテストを書ける

あたりの機能性のあるテストライブラリがほしいよーという内容を、具体的なサンプルコードや機能性を25行くらいインプットしたプロンプト

...

...

...

という感じで、5,6ターンしているうちに概要設計ができあがってきちゃったわけだ。↑の画像には書いていないが、1000行規模のコードで具体的な説明をかなり詳細に書いてくれていて、「あー、たしかにこれならできそうだなー」という実感が強烈に持てた。

ChatGPTに設計書を書かせてOpenAI Codexで実装する

これならできそうだーという実感を持てたところで、ChatGPTにその設計書をアウトプットさせてOpenAI Codex (gpt-5.5 xhigh)で一気に実装させた。

テストランナーが正しく動いていることを確認するテストもそのテストランナーベースで書かせて、ドキュメンテーションサイトもDocusaurusで作らせた。

smartest-rb.vercel.app

さらに、この内容が実現可能な説明になっていることもテストさせるようにした。(AIコーディングの品質担保もだんだん慣れてきたw)

そして、既存テストに影響をあたえずブラウザテストを簡単に書く方法もできあがってしまった

テストフォルダが testやspecだとMinitestやRSpecと衝突して、既存テストのconfigを変えないと導入できないので不都合だ。そうならないように、自動ロードされるテストフォルダは ライブラリ名と同じ smartest/ 配下に限定し、テストの実行コマンドも bundle exec smartest path/to/test.rb のようなコマンドを用意して、Playwright testくらいお手軽にブラウザテストを書けるテストランナーができてしまった!!

smartest-rb.vercel.app

おそらくここまでの制作時間は通算4時間くらい。

image

我ながら、これは結構最高な使い勝手と言えそう。

Google検索で出るようにするのもChatGPTに頼るとよさそう

PyTestのRuby版として認知させようとしても "pytest fixtures ruby" などのGoogle検索で出るようにするにはコツがいる。

...

AI自身にも検索させて「出ませんねぇ」とわからせたうえで、今回のライブラリの存在をわからせて

最後に「これどうやったら検索結果に出るようになるん?」と聞けば、いろいろ対策を教えてくれた。

改善項目が12個出されてきたので、それをfeedback.mdっていうファイルに書き出させて、それをOpenAI Codexとともに解消していくと、1日後には検索結果にAI要約でsmartestが出るようになった!!

今は、 "smartest rubygems" で↓のサイトが出ないのに対応をしていたりもする。

rubygems.org

smarter_csvという別のGemが検索結果に出てきているし、もしかして "smarter_csv rubygems" と言われている。これが数日後にはどうなるかな...

キーワードの取り合い的な攻めたSEOだと専門家に頼む必要はあるのかもわからんけど、検索結果に出ないのを出るようにしたいだけならChatGPTに聞けば十分ということが改めてわかってしまったのであった...。

AIエージェントで言語の壁は崩せる

以前にデブサミ2025でこんな話をしたのだけど、

現在においてはAIエージェントのコーディングのおかげで、他言語のフレームワークのエッセンスを自分が使っている言語のフレームワークに取り入れることは非常に容易になった。

Ruby on Railsの代替フレームワークが出てきたとて既存のRailsで作っちゃった製品はそう簡単に移行できないので、他の言語のいいところをRubyに取り込むのは結構アリだなと改めて思ったのであった。