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;
}

https://github.com/jestjs/jest/blob/efe3eddae6506bc2429b464374fe048ce5cfa8e7/packages/jest-types/src/Global.ts#L152-L153

次にjest-circusを見る。jestのv27以降はjest-circusがデフォルトのテストランナーとなっている。

itにtestをそのまま代入している箇所を発見した。

const test = ... // 長いのでパーマリンク先参照

const it: Global.It = test;

https://github.com/jestjs/jest/blob/efe3eddae6506bc2429b464374fe048ce5cfa8e7/packages/jest-circus/src/index.ts#L244

v27以前はjest-jasmine2がデフォルトのテストランナーだったので、こっちも念の為確認する。

ここが該当処理なのかは軽くコードを読んだ感じだと確信は持てなかったが、大体あっていそう。

environment.global.test = environment.global.it;

https://github.com/jestjs/jest/blob/efe3eddae6506bc2429b464374fe048ce5cfa8e7/packages/jest-jasmine2/src/index.ts#L102

その他

issueにもそれらしき説明や記述はなかった。

itについて触れているissueが2014年5月からあるので、jestがOSSとして公開された当初からitは存在してるのかもしれない。

https://github.com/jestjs/jest/issues/15

mochaのドキュメントを読んでいたら、itはBDDのインタフェースで、testはTDDのインターフェースとして紹介されているのを発見した。

https://mochajs.org/#bdd

https://mochajs.org/#tdd

どうやら目的に合わせて文脈にあった構文を使おうということっぽい。(使ったことがないのでわからない)

BDDとTDDの説明はこちらの記事がわかりやすかった。

https://codezine.jp/article/detail/7367

他にもxUnitやRubyのRSpecといった他言語のスタイルの影響を受けているだったり、mochaやjasminからの移行を考えられているなどの意見をstackoverflowから確認できた。

参考

by me a coffee