如何使单元测试始终通过?

时间:2010-06-05 13:54:08

标签: java testing reflection

让我们假设有人必须为问题编写解决方案,我必须通过一些测试来测试他的解决方案。是否有可能(可能有反思或某些东西)他的程序通过我所有的测试,但与问题的真正解决方案没有任何共同之处?

4 个答案:

答案 0 :(得分:5)

一般情况

在一般情况下,没有。由于他们甚至不知道你是否正确地实施了测试,他们所做的一切 - 甚至没有正确实施作业 - 都可以保证通过测试。

特殊情况

如果学生可以运行测试,他们可以使用学习算法。

如果学生可以访问测试的源代码,他们可以查找使用反射来获取存储在变量中的预期结果的技巧。如果他们找不到任何源代码技巧,他们仍然可以编译并运行你的测试。

如果学生可以访问测试的字节代码,他们可能会反汇编它并使用源代码技巧。即使你有效地模糊了它,它们仍然可以运行它。

如果学生知道您正在测试学生代码与其他学生代码,那么他们所要做的就是一致。

<强>推荐

  1. 不要让学生参加考试。他们应该独立测试他们的作业。在他们将作业提交给您进行正式评估后,请进行测试。
  2. 使用随机化使您的测试更加健壮。
  3. 如果您的测试将学生代码与其他学生代码进行比较,那么您应该手动调查每个失败。也许一个学生正确实施,其他人复制了不正确的实施。在这种情况下,多数规则奖励无能。
  4. 您可以收集他们的测试并测试他们的测试。

答案 1 :(得分:1)

不确定。即使没有测试的源代码,他们也可以使用像ASM这样的字节码操纵器或反编译器来关联输入和所需的响应。

答案 2 :(得分:0)

JUnit 4有@Ignore注释,以这种方式使用:

@Ignore
@Test
public void testSmth() {
   ...
}

但我正在尝试对您描述的情况进行成像。我能做的唯一事情就像ACM问题验证器(如PC^2)。

如果是这种情况,您将调用代码进行测试,您将完全控制流程。所以用户不可能以这种方式作弊。

答案 3 :(得分:0)

绝对

如果学生发现你的测试正在寻找什么,他们可以编写产生该结果的代码,而无需解决作业问题。

反思?是的,如果您将预期结果保留在变量中。我不确定是否可以读取内联常量。但无论如何,在安全管理器的沙盒中运行他们的代码。无论如何,你想要这样做:如果他们的代码是恶意的,或者有意想不到的后果怎么办?