node.js - jestのテストをテストすることは可能ですか?
私は、さまざまな演習をテストするツールを作りたいです。ある演習はユニットテストです。したがって、学生が作成したテストが良いテストかどうかをテストする必要があります。例えば、学生が次のコードを持っているとします:
export class HelloWorld {
public static showHello(): string {
return 'Hello World!';
}
}
次のJestテストで:
import { HelloWorld } from '..';
describe(Hello World exercise, () => {
test('Check function is defined', () => {
expect(HelloWorld.showHello()).toBeDefined();
});
test('Empty input results in Hello World!', () => {
expect(HelloWorld.showHello()).toBe('Hello World!');
});
});
その学生が実際にこれら二つのテストを試したことをどうやって確認できますか?私はこう考えました
export const firstTest = test()...
そして次に、firstTest が正しいことをテストするかどうかをテストします。しかし、欠点は、この解決策のためにすべてのテストをエクスポートしなければならないことです。
回答 #1
テストのテストを行うにはブラックボックステストが必要であり、これは事前にどのテストが書かれているか(そしてそれがどのように書かれるべきか)を知っている必要があるか、または各テストを確認してそれぞれに対して独自のテストを書く必要があることを意味します。学生のテストの理解度を評価し、自動化された方法でこれを行おうとしている場合、どちらの選択肢も現実的ではないと思われます。
しかし、使用できるヒューリスティックはいくつかあります。これらの方法の最初の3つを組み合わせて使うことをお勧めします。
- 学生が必ず実装しなければならない公開インターフェースを定義し、この公開インターフェースに対するテストを書きなさい。これは学生のテスト自体を直接テストするものではありませんが、もしどれかのテストが失敗した場合、十分な(品質の高い)テストを書いていなかったことを意味します。これらのテストは簡単で明白なものであり、学生が注力すべきものです。
- istanbul のようなコードカバレッジツールを使用してください。これはテストの品質を直接テストするものではありませんが、テストが実際にコードに触れていることを確認する自信を与えてくれます。
- この方法は最近発見した「Adversarial Gamedays」と呼ばれる手法に触発されたものであり(実装ではありません)。この方法では、学生のコードをいくつかの箇所、例えば10か所ランダムに壊し、そのコードを実行させます。テストは作成したすべてのバグを見つけるとは限りませんが、あらかじめ決めた許容可能なコードカバレッジx%は検出できるはずです。バグはプログラム全体に十分に分散させ、単一の欠陥を利用することがないようにします。これにより、量と質の両方をテストできます。
- 目視検査および/または手動テスト。この方法はエラーが発生しやすく、時間がかかります。もしTAがいなければ、おそらく実行可能なオプションではありません。しかし、この方法に十分な時間を費やせば、最も徹底的で偏りが少ない方法です。
述べたように、最初の3つのオプションを組み合わせることが最適です。例えば、システムの公開インターフェースを提供し、コードカバレッジツールを実行し、各学生のプライベート実装の任意の部分をランダムに壊すことです。