具有“复杂”参数的函数的C#单元测试结构

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

单元测试功能

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

从两条任意长度和线段返回一个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)坐标由’,’分隔.为简洁起见,此示例在2D中.

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

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

然后解析它以获得所需的点列表.然后可以检查这样:

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

然而,这似乎很混乱.

期望的解决方案

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

>简单地添加数据(例如,序列化对象,易于手动输入,如CSV方法)
>直观(在CSV文件中存储点列表的意义上)
>最好坚持使用简单的数据源,如CSV,XML或JSON.

真的,我只是在寻找“正确”的方法来解决这个问题,因为我所采取的方向似乎是“错误的”.

任何帮助,将不胜感激!!

最佳答案 这是正确的方法,显然对于3D数据集而言不方便,但序列化对象并不简单.

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

点赞