Unit testing 如何在图算子上进行单元测试

Unit testing 如何在图算子上进行单元测试,unit-testing,Unit Testing,我有一个处理图形计算的应用程序。我想对它进行单元测试,但我发现很难进行测试 主要类别如下所示: 网格存储图形结构 GridInput解析inputfile并保存到网格中 GridOperator在网格上执行一些操作 GridOperator在网格上执行一些操作 生产代码类似于 string configure_file = "data.txt"; GridInput input(configure_file); Grid grid = input.parseGrid(); GridOperato

我有一个处理图形计算的应用程序。我想对它进行单元测试,但我发现很难进行测试

主要类别如下所示:

网格存储图形结构

GridInput解析inputfile并保存到网格中

GridOperator在网格上执行一些操作

GridOperator在网格上执行一些操作

生产代码类似于

string configure_file = "data.txt";
GridInput input(configure_file);
Grid grid = input.parseGrid();
GridOperatorA a;
a.operator(grid);
GridOpeartorB b;
b.operator(grid);
我发现代码很难测试

我的单元测试代码如下所示

// unit test for grid input
string configure_file = "data.txt";
GridInput input(configure_file);
Grid grid = input.parseGrid();
// check grid status from input file
assert(grid.someAttribute(1) == {1,2,3,4,...,100}); // long int array hard to understand
...
assert(grid.someAttribute(5) == {100,101,102,...,200}); // long int array hard to understand
在我的选择中,我的单元测试并不好,它有很多缺点

单元测试很慢,为了测试OperatorA、OperatorB,它需要执行文件IO

单元测试不清楚,他们需要在操作员之后检查网格状态,但是检查大量数组对于程序员来说很难理解数组代表什么。几天后,程序员无法理解发生了什么

单元测试只针对一个配置文件,如果我需要从多个配置文件测试网格,那么会有更多难以理解的数组

我读过一些打破依赖关系的技巧,比如模拟对象。我可以模拟从配置文件读取的网格。但是模拟数据就像配置文件中的数据存储一样。我可以在operatorA之后模拟网格,但是模拟数据就像operatorA之后的网格状态一样。它们还将导致许多难以理解的数组

在我的情况下,我不知道如何进行单元测试。任何声音都是感激的。谢谢您的时间。

摆脱io

您可以向GridInput传递类似于数据提供程序的内容。在生产代码中,它将读取文件。在测试代码中,您可以将其替换为提供硬编码数据的测试双存根。你已经在上面提到了

您还可以让其他人(即其他代码)负责加载文件,并将加载的数据传递给网格。只要看看网格,测试就变得简单了,因为根本不需要文件处理

要使测试更具可读性,可以执行以下操作:

使用不仅仅是testMethod的好的测试方法名称。根据您正在测试的内容命名它们。您可以将注释用作方法名称。在单个测试中只测试一个方面

用正确命名的常量替换内联数组。常量的名称有助于理解在给定断言中检查的内容

someAttribute方法的参数也是如此

另一个选项是创建自己的assert方法来隐藏一些细节。类似于assertThatMySpecialConditionIsMetgrid的东西

您还可以编写一个测试数据生成器,以避免对数组进行硬编码。这不是我第一次考试的建议。经过几次测试后,可以看到可以移动到生成器的模式

只是一些提示,让您开始-

// unit test for operator A
string configure_file = "data.txt";
GridInput input(configure_file);
Grid grid = input.parseGrid();
GridOperatorA a;
a.operator(grid);
// check grid status after opeator A
assert(grid.someAttribute(1) == {1,3,,7,4,...,46}); // long int array hard to understand
...
assert(grid.someAttribute(5) == {59,78,...,32}); // long int array hard to understand
// unit test for operator B
string configure_file = "data.txt";
GridInput input(configure_file);
Grid grid = input.parseGrid();
GridOperatorA a;
a.operator(grid);
GridOperatorA b;
b.operator(grid);
// check grid status after opeator B
assert(grid.someAttribute(1) == {3,2,7,9,...,23}); // long int array hard to understand
...
assert(grid.someAttribute(5) == {38,76,...,13}); // long int array hard to understand