jestのitとtestの違いを調べてみた
2023/06/24
結論
挙動の違いはない。BDDやTDDといった手法に基づいて選択できるのがよさそう。
itとtestの違い
jestには構文としてitとtestが存在する。体感としてはitの方が使われている印象があるが、両方使われていたりするケースもあったりする。
自分がレビューする立場だったら、同一ファイルにitとtestがばらばらで使われていたら「統一したくないですか?」などと言いそうだが、そもそもなぜ統一するのか、寄せるとしたらどちらがよいのか?が気になったので調べてみた。
ドキュメントには
https://jestjs.io/docs/api#testname-fn-timeout
Also under the alias: it(name, fn, timeout)
とあり、これはエイリアスであると書かれている。自分が知っているエイリアスの意味と同じであれば、名前が違うだけであるということになる。
実装は
本当かどうか実装を確かめてみる。
まずは型定義がある@jest/types
を見る。
TestFrameworkGlobals
のitとtestが普段使っているitとtestのIFだろう。
ここでは同じ型を参照していて、ジェネリクスなどの分岐もないためIFは同一であることがわかる。
export interface ItBase {
(testName: TestNameLike, fn: TestFn, timeout?: number): void;
each: Each<TestFn>;
failing: Failing<TestFn>;
}
export interface It extends ItBase {
only: ItBase;
skip: ItBase;
todo: (testName: TestNameLike) => void;
}
export interface ItConcurrentBase {
(testName: TestNameLike, testFn: ConcurrentTestFn, timeout?: number): void;
each: Each<ConcurrentTestFn>;
failing: Failing<ConcurrentTestFn>;
}
export interface TestFrameworkGlobals {
it: ItConcurrent;
test: ItConcurrent;
fit: ItBase & {concurrent?: ItConcurrentBase};
xit: ItBase;
xtest: ItBase;
describe: Describe;
xdescribe: DescribeBase;
fdescribe: DescribeBase;
beforeAll: HookBase;
beforeEach: HookBase;
afterEach: HookBase;
afterAll: HookBase;
}
次にjest-circusを見る。jestのv27以降はjest-circusがデフォルトのテストランナーとなっている。
itにtestをそのまま代入している箇所を発見した。
const test = ... // 長いのでパーマリンク先参照
const it: Global.It = test;
v27以前はjest-jasmine2がデフォルトのテストランナーだったので、こっちも念の為確認する。
ここが該当処理なのかは軽くコードを読んだ感じだと確信は持てなかったが、大体あっていそう。
environment.global.test = environment.global.it;
その他
issueにもそれらしき説明や記述はなかった。
itについて触れているissueが2014年5月からあるので、jestがOSSとして公開された当初からitは存在してるのかもしれない。
https://github.com/jestjs/jest/issues/15
mochaのドキュメントを読んでいたら、itはBDDのインタフェースで、testはTDDのインターフェースとして紹介されているのを発見した。
どうやら目的に合わせて文脈にあった構文を使おうということっぽい。(使ったことがないのでわからない)
BDDとTDDの説明はこちらの記事がわかりやすかった。
https://codezine.jp/article/detail/7367
他にもxUnitやRubyのRSpecといった他言語のスタイルの影響を受けているだったり、mochaやjasminからの移行を考えられているなどの意見をstackoverflowから確認できた。