具有"复杂"的功能的C#单元测试结构参数

时间:2016-01-07 00:21:40

标签: c# nunit mstest xunit

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

单元测试功能

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

从两条任意长度和段的线返回一个3D点(x,y,z)(假设它们在一个点上相交)。可以说你需要测试的只是更简单的功能:

Point3D GetIntersectionPointSimple(LineSegment segment1, LineSegment segment2)

&#34; LineSegment&#34;是一个单一的直线段。但是我想用多个交叉点来捕获这个案例,并且对解决方案很感兴趣,因为它非常通用。

尝试解决方案

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

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

各个点由&#39;;&#39;分隔。并且(x,y)坐标由&#39;,&#39;分隔。这个例子只是为了简洁而在2D中。

通过这个,您可以读取每个字符串,如:

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

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

Assert.AreEqual(parsedIntersectionPoint, GetIntersectionPoint(parsedLine1, parsedLine2))
然而,这似乎很混乱。

所需解决方案

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

  1. 简单地添加数据(例如序列化对象,易于手动输入,如CSV方法)
  2. 直观(在CSV文件中存储点列表的意义上)
  3. 最好坚持使用简单的数据源,如CSV,XML或JSON。
  4. 我真的只是在寻找&#34;对&#34;这样做的方法,因为我采取的方向似乎是错误的#34;。

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

1 个答案:

答案 0 :(得分:2)

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

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