具有 "complex" 参数的函数的 C# 单元测试结构

C# Unit Test structure for functions with "complex" parameters

我正在使用 C# 并试图弄清楚要使用哪个单元测试框架(MSTest、Nunit、Xunit)以便最好地采用数据驱动的测试方法。我有一些单元测试经验,但只有非常简单的功能。下面定义了我想对其应用单元测试的功能,以及我尝试的解决方案和所需解决方案的形式。

函数到单元测试

Point3D GetIntersectionPoint(List<Point3D> line1, List<Point3D> line2)

其中 returns 来自任意长度和线段的两条线的 3D 点 (x,y,z)(假设它们相交于一个点)。可以说您需要测试的只是更简单的函数:

Point3D GetIntersectionPointSimple(LineSegment segment1, LineSegment segment2)

其中 "LineSegment" 是一条直线段。但是我想用多个交叉点来捕获案例,并且对解决方案很感兴趣,因为它相当普遍。

尝试的解决方案

在 MSTest 中很容易从数据源中获取一行数据,所以我在 CSV 文件中有以下内容:

LineA            LineB                IntersectionPoint
0,0;1,0;2,0      1.5,1;1.5,0;1.5,-1   0,1.5

各个点由“;”分隔(x,y) 坐标由“,”分隔。为了简洁起见,这个例子是二维的。

有了这个,您可以读入每个字符串,例如:

TestContext.DataRow["LineA"].ToString()

然后解析它得到想要的点列表。然后可以这样检查:

Assert.AreEqual(parsedIntersectionPoint, GetIntersectionPoint(parsedLine1, parsedLine2))

然而这看起来很乱。

期望的解决方案

理想情况下,此问题的解决方案应满足以下条件:

  1. 添加数据简单(例如序列化对象,在 CSV 方法中易于手动输入)
  2. 直观(在 CSV 文件中存储点列表不是)
  3. 最好坚持简单的数据源,例如 CSV、XML 或 JSON。

真的,我只是在寻找 "right" 方法来解决这个问题,因为我选择的方向似乎是 "wrong"。

任何帮助将不胜感激!!

这是正确的方法,显然对于 3D 数据集来说不方便,但序列化对象不会更简单。

编写 3 个嵌套循环来对函数进行边界测试并将这些结果打印到 csv 可能更容易。然后使用 3 个嵌套循环 (x,y,z) 对函数进行单元测试,检查您在函数中所做的任何更改都不会改变预期的输出。