質問: ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/ea4e8241bea9cb5320fce063b197b7bc.png) あるプロジェクトをGitHubからダウンロードしてきて、 画像のように適当にクラス名を変えてみました(ファイル名は変えていない)。 そしてReadme.md通り、 $ gradle firefoxTest と叩いて実行してみると、 このクラスの中に書いてある処理が実行されてしまいました。 変えた名前に対応して呼び出し側も変えてないのにです。 (というかそもそも呼び出し側のクラス名がプロジェクト内のどこにもみつかりません) なぜ名前を変えてあるのに実行できるのでしょうか? さらに言えば上記のfirefoxTestというテスト名さえもプロジェクト内のどこにも存在しません。 なんだか気持ち悪いです。 なぜこのようなことができるのでしょうか? ※ちなみにこれはJavaから派生したGroovyという言語で書いていますが、 Javaでも同じことが言えると思います。 よろしくお願いいたします。
回答: 私は Groovy も Geb も Spock も使ったことがないので、やや適当な回答ですが... > > $ gradle firefoxTest > > のようにテスト名を打つと、実行されます。 > > ... > > さらに言えばfirefoxTestというテスト名さえもプロジェクト内のどこにも存在しません。 > > > `firefoxTest` は build.gradle で、テストを実行するタスクとして定義されています。 build.gradle ``` ext { drivers = ["firefox", "chrome", "phantomJs"] // ...(中略)... } // ...(中略)... drivers.each { driver -> task "${driver}Test"(type: Test) { reports { html.destination = reporting.file("$name/tests") junitXml.destination = file("$buildDir/test-results/$name") } outputs.upToDateWhen { false } // Always run tests systemProperty "geb.build.reportsDir", reporting.file("$name/geb") systemProperty "geb.env", driver // If you wanted to set the baseUrl in your build... // systemProperty "geb.build.baseUrl", "http://myapp.com" } } // ...(以下略)... ``` `drivers = ["firefox", "chrome", "phantomJs"]` となっていることから、`task "${driver}Test"(type: Test)` のところで、`firefoxTest`、`chromeTest`、`phontomJsTest` の3つのテストタスクが定義されます。 > > ですが、プロジェクト内のどのファイルにもこのクラス名を呼ぶような記述はなく、 > > > この、適当な名前にリネームしたクラスですが、`GebReportingSpec` を extend しています。先ほどの `firefoxTest` などのタスク内に、`reports` と書かれていますので、Geb が class path で見つけたクラスの中で、`GebReportingSpec` を extend しているクラスを探し出して、実行しているのだと思います。 これはなにも Geb に限ったことではなく、JUnit を含む、Java のテストフレームワークで一般的に行われていることです。