具有 "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))
然而这看起来很乱。
期望的解决方案
理想情况下,此问题的解决方案应满足以下条件:
- 添加数据简单(例如序列化对象,在 CSV 方法中易于手动输入)
- 直观(在 CSV 文件中存储点列表不是)
- 最好坚持简单的数据源,例如 CSV、XML 或 JSON。
真的,我只是在寻找 "right" 方法来解决这个问题,因为我选择的方向似乎是 "wrong"。
任何帮助将不胜感激!!
这是正确的方法,显然对于 3D 数据集来说不方便,但序列化对象不会更简单。
编写 3 个嵌套循环来对函数进行边界测试并将这些结果打印到 csv 可能更容易。然后使用 3 个嵌套循环 (x,y,z) 对函数进行单元测试,检查您在函数中所做的任何更改都不会改变预期的输出。
我正在使用 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))
然而这看起来很乱。
期望的解决方案
理想情况下,此问题的解决方案应满足以下条件:
- 添加数据简单(例如序列化对象,在 CSV 方法中易于手动输入)
- 直观(在 CSV 文件中存储点列表不是)
- 最好坚持简单的数据源,例如 CSV、XML 或 JSON。
真的,我只是在寻找 "right" 方法来解决这个问题,因为我选择的方向似乎是 "wrong"。
任何帮助将不胜感激!!
这是正确的方法,显然对于 3D 数据集来说不方便,但序列化对象不会更简单。
编写 3 个嵌套循环来对函数进行边界测试并将这些结果打印到 csv 可能更容易。然后使用 3 个嵌套循环 (x,y,z) 对函数进行单元测试,检查您在函数中所做的任何更改都不会改变预期的输出。