是否可以测试笑话测试?

时间:2018-11-15 13:18:50

标签: node.js typescript testing jestjs

我想做一个测试不同练习的工具。一种练习是单元测试。因此,我需要测试学生所做的测试是否是好的测试。例如,学生有以下代码:

export class HelloWorld {
  public static showHello(): string {
    return 'Hello World!';
  }
}

进行以下笑话测试:

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 个答案:

答案 0 :(得分:0)

测试需要黑盒测试,这意味着您要么需要事先知道编写了哪些测试(以及应该如何编写),要么需要查看每个测试并为每个测试编写唯一的测试。鉴于您正在尝试测试学生对测试的理解并以自动化的方式进行,我怀疑这两种选择都是可行的。

但是,您可以使用几种启发式方法。我建议结合使用这三种方法中的前三种。

  1. 定义一个公共接口,您的学生必须实现该接口并编写测试到该公共接口。这不会直接测试学生的测试,但是如果您的任何测试失败,则他们不会编写足够的(质量)测试。这些测试应该简单易行,让您的学生更加关注。
  2. 使用代码覆盖率工具,例如istanbul。这并不能直接测试测试的质量,但是可以使您确信测试实际上可以触及代码。
  3. 此方法受[em]启发(不是我的一项实现),我最近发现了一种称为“ Adversarial Gamedays”的技术。对于这种方法,您将在多个地方随机中断学生的代码,比如说10,然后运行代码。这些测试可能不会捕获您所做的所有错误,但是它们应该捕获x%,其中x是您确定的可接受代码覆盖率。错误应在程序中充分散布,以免利用单个缺陷。这同时测试了数量和质量。
  4. 外观检查和/或手动测试。该方法容易出错且耗时。如果您没有助教,那可能不是一个可行的选择。但是,如果您在此方法上花费足够的时间,则它是最彻底,最不偏执的方法。

正如我所说,前三个选项的组合将是最佳选择。例如,为系统提供一个公共界面,运行代码覆盖工具,并随机破坏每个学生私有实施的y区域。