竞争性编程:生成测试用例并验证程序的正确性

时间:2016-12-28 10:35:54

标签: algorithm data-structures

我已经做了一段时间的体育节目,并且仍在日复一日地进步。但是我一直想知道的一件事是,如果我可以自动化测试用例生成过程和程序的交叉验证,那将是非常好的。绝对是一种强力方法,因为一些测试用例是特定于算法的。

进行谷歌搜索为我提供了一个很好的Quora链接:How do programming contest problem setters make test cases ?和问题制定者使用的热门testlib

但这不是鸡蛋问题吗?

假设我生成了100万个输入测试用例,但我会检查它们是什么?我将如何生成输出?因为我仍在验证程序...如果我的脚本也生成了正确的输出,那么最初是编写程序的重点。我可以自己提交脚本。此外,它不可能手动为生成的测试用例写入100万个输出。任何人都可以澄清这种混乱。

我希望我已正确澄清问题。

3 个答案:

答案 0 :(得分:1)

通过缓慢但明显正确的解决方案(如穷举搜索)生成答案很常见。它不能用作主要解决方案,因为它对于大型测试用例来说太慢了,但您可以使用它检查快速(但可能不正确)程序的输出。

答案 1 :(得分:1)

嗯,事情并不像你想象的那么广泛。竞争性编程中的测试生成由问题的算法和正确性证明引导。

因此,如果您分析了程序可能存在的不同情况,那么当您认为有数百万个测试用例时,您可能会获得所有测试用例。也许在某些算法中,您有时会处理数组的偶数索引元素或奇数索引元素。那你要做什么?将它分为偶数或奇数2。考虑偶数的最小情况。奇数也一样。这样你基本上就可以访问程序的所有控制流程。

在竞争性编程中,当我们首先确定算法然后我们决定适当的输入大小然后所有这些测试用例和验证时,通常很容易想到角点。 1000000个元素的测试用例或输入为0或1时的测试用例...这样的测试用例。

另一个是大多数时候我们编写的蛮力解决方案比原始解决方案慢得多。现在我们做什么?我们只生成随机中等大小的测试用例,然后再次运行慢速程序,我们可以查看我们的检查器解决方案等。

正确性也受到一些数学证明的指导。(启发式,归纳式,盒式原理,数论等)这样我们就能确定解决方案的正确性。

答案 2 :(得分:0)

今年早些时候我遇到了同样的问题,我看到我的一些同事也在想办法解决这个问题。因为有时我实在想不出更多的测试用例,于是我决定自己制作一个测试用例生成器工具,它是免费和开源的,任何人都可以使用。

您可以使用此工具轻松生成大量测试用例,并使用正确但较慢的方法(在时间复杂度和空间复杂度方面)给出的输出来验证结果。您可以并行运行它们并检查输出,也可以编写一个简单的脚本来比较两个程序的输出(较慢但正确的程序和更好但不确定的程序)以进行验证。

我相信优秀的程序员无论如何都不需要它,但对于中级(div2、div3)程序员和新手来说,它可以证明是非常有帮助的。 您可以从 GitHub 访问它:Test Case generator

enter image description here

python 源代码和 .exe 文件都有说明,

  • 如果您想自己进行一些更改,可以使用 python 文件。
  • 如果您只是直接希望它生成一些测试用例,您应该更喜欢 .exe 文件(在 zip 内)。 如果您正在开始竞争性编程之旅,这将大有帮助。

此外,我们随时欢迎您提出任何建议或改进。此外,您还可以通过添加一些您认为该项目缺乏的功能或通过自己添加一些新的测试用例格式或根据要求制作相同的格式来为该项目做出贡献。