传统软件测试与 Alloy 实例生成

Traditional software testing versus Alloy instance generation

在传统的软件开发中,测试代表了软件要表达的意思。通过对软件执行测试,您可以了解该软件是否符合您的想法。 “这就是我想说的,我真的这么说了吗?

Alloy 实例显示您在模型中所说的内容。您检查实例并确定这是否是您要让模型表达的意思。 “这是你说的,是你想说的吗?

您同意软件测试和 Alloy 实例生成之间的这种区别吗?在比较软件测试和 Alloy 实例生成方面,您有什么要补充的吗?

是的,您用自己的话描述了验证(我构建正确的东西)和验证(我构建正确的东西)之间的区别。

虽然如您命名的 "testing" 用于验证软件是否已正确构建,但恕我直言,Alloy 能否同时用于验证和验证,如下所述:

验证: 从空谓词生成的实例为您提供了符合您的规范的实例,使您能够掌握您指定的内容。您可以使用从审查这些实例中获得的知识来验证您的规范。 事实上,这些实例将帮助您回答以下问题:生成的实例是否反映了我要指定的内容?我构建的内容是否正确) .

Verification 在 Alloy 中,您还可以通过使用断言来验证规范中是否遵守某些 属性。检查断言会产生可能的反例,这些反例的存在可以证明您的规范不符合违反的断言。如果有的话,从检查断言生成的 counter-examples 可以帮助您回答这个问题:我是否正确指定了我的模型 w.r.t。我的断言?我做对了吗?)。

有意思。我使用 Alloy 代表 "test data"(不是软件本身)。通过这种方式我发现使用测试数据和编写测试代码就是验证;但通过正式规范指定测试数据是Validation。当我通过Alloy指定测试数据时,我需要比软件测试更大的视角。

例如,考虑软件获取日期数据,您必须测试软件是否可以拒绝无效的日期值。另一方面,当您通过 Alloy 指定用于测试软件的测试数据时,您必须定义满足 "Date" 要求的数据。

我认为这些观点的变化意味着验证和验证之间的区别(以及软件测试和 Alloy 实例生成之间的区别)。