证明单元测试的正确性

Tim*_*sen 3 unit-testing correctness proof

我正在创建一个用于学习目的的图形框架.我正在使用TDD方法,因此我正在编写大量的单元测试.但是,我仍然在弄清楚如何证明我的单元测试的正确性

例如,我有这个类(不包括实现,我已经简化了)

public class SimpleGraph(){
 //Returns true on success
 public boolean addEdge(Vertex v1, Vertex v2) { ... }

 //Returns true on sucess
 public boolean addVertex(Vertex v1) { ... }
}
Run Code Online (Sandbox Code Playgroud)

我也创建了这个单元测试

@Test
public void SimpleGraph_addVertex_noSelfLoopsAllowed(){
 SimpleGraph g = new SimpleGraph();
 Vertex v1 = new Vertex('Vertex 1');
 actual = g.addVertex(v1);
 boolean expected = false;
 boolean actual = g.addEdge(v1,v1);
 Assert.assertEquals(expected,actual);
}
Run Code Online (Sandbox Code Playgroud)

好的,真棒它有效.这里只有一个关键,我已经证明这些函数只适用于这种情况.然而,在我的图论课程中,我所做的只是在数学上证明定理(归纳,矛盾等等).

所以我想知道有没有办法证明我的单元测试在数学上是正确的?那么这是一个很好的做法.因此,我们正在测试单元的正确性,而不是针对某个特定结果对其进行测试.

Mar*_*ers 5

不可以.在一般情况下,单元测试并不试图证明其正确性.他们应该测试具体的例子.我们的想法是选择足够的代表性示例,如果出现错误,可能会通过一个或多个测试找到它,但您无法确保以这种方式捕获所有错误.例如,如果您是单元测试添加函数,您可能会测试一些正数,一些是负数,一些是大数,一些是小数,但仅使用这种方法,您很幸运能找到这种实现不起作用的情况:

int add(int a, int b) {
    if (a == 1234567 && b == 2461357) { return 42; }
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以通过组合单元测试和代码覆盖来发现此错误.然而,即使有100%的代码覆盖率,也可能存在逻辑错误,这些错误并未被任何测试所捕获.

可以证明代码的正确性.它被称为形式验证,但它不是单元测试的用途.除了最简单的软件之外,所有这些都很昂贵,因此很少在实践中完成.