让我们假设有人必须为问题编写解决方案,我必须通过一些测试来测试他的解决方案。是否有可能(可能有反思或某些东西)他的程序通过我所有的测试,但与问题的真正解决方案没有任何共同之处?
答案 0 :(得分:5)
一般情况
在一般情况下,没有。由于他们甚至不知道你是否正确地实施了测试,他们所做的一切 - 甚至没有正确实施作业 - 都可以保证通过测试。
特殊情况
如果学生可以运行测试,他们可以使用学习算法。
如果学生可以访问测试的源代码,他们可以查找使用反射来获取存储在变量中的预期结果的技巧。如果他们找不到任何源代码技巧,他们仍然可以编译并运行你的测试。
如果学生可以访问测试的字节代码,他们可能会反汇编它并使用源代码技巧。即使你有效地模糊了它,它们仍然可以运行它。
如果学生知道您正在测试学生代码与其他学生代码,那么他们所要做的就是一致。
<强>推荐强>
答案 1 :(得分:1)
不确定。即使没有测试的源代码,他们也可以使用像ASM这样的字节码操纵器或反编译器来关联输入和所需的响应。
答案 2 :(得分:0)
JUnit 4有@Ignore
注释,以这种方式使用:
@Ignore
@Test
public void testSmth() {
...
}
但我正在尝试对您描述的情况进行成像。我能做的唯一事情就像ACM问题验证器(如PC^2)。
如果是这种情况,您将调用代码进行测试,您将完全控制流程。所以用户不可能以这种方式作弊。
答案 3 :(得分:0)
绝对。
如果学生发现你的测试正在寻找什么,他们可以编写产生该结果的代码,而无需解决作业问题。
反思?是的,如果您将预期结果保留在变量中。我不确定是否可以读取内联常量。但无论如何,在安全管理器的沙盒中运行他们的代码。无论如何,你想要这样做:如果他们的代码是恶意的,或者有意想不到的后果怎么办?