有这么一个计算数组最大值的方法.
namespace
NUnitTest
{
public class MathCompute
{
public int Largest( int [] array)
{
if ( null == array || 0 == array.Length)
{
throw new Exception( " 参数传递错误 " );
}
int largest = Int32.MinValue;
foreach ( int element in array)
{
if (element > largest)
{
largest = element;
}
}
return largest;
}
}
}
{
public class MathCompute
{
public int Largest( int [] array)
{
if ( null == array || 0 == array.Length)
{
throw new Exception( " 参数传递错误 " );
}
int largest = Int32.MinValue;
foreach ( int element in array)
{
if (element > largest)
{
largest = element;
}
}
return largest;
}
}
}
我们写一段测试代码,使用NUnit的TestCaseSource属性测试它.
namespace
NUnitTest
{
[TestFixture]
public class MathComputeTest
{
private MathCompute mc;
[TestFixtureSetUp]
public void Init()
{
mc = new MathCompute();
}
[Test, TestCaseSource( " LargestCases " )]
public void TestLargest( int [] arr, int expected)
{
Assert.AreEqual(expected,mc.Largest(arr));
}
#region 数据部分
static object [] LargestCases =
{
new object [] { new int []{ 1 , 2 , 3 , 4 }, 4 },
new object [] { new int []{ - 2 , - 3 , - 5 , - 9 }, - 2 },
new object [] { new int []{ 1 }, 1 },
new object [] { new int []{ 20 , 20 , 20 , 20 }, 20 },
// new object[] {new int[]{},null}
};
#endregion
}
}
{
[TestFixture]
public class MathComputeTest
{
private MathCompute mc;
[TestFixtureSetUp]
public void Init()
{
mc = new MathCompute();
}
[Test, TestCaseSource( " LargestCases " )]
public void TestLargest( int [] arr, int expected)
{
Assert.AreEqual(expected,mc.Largest(arr));
}
#region 数据部分
static object [] LargestCases =
{
new object [] { new int []{ 1 , 2 , 3 , 4 }, 4 },
new object [] { new int []{ - 2 , - 3 , - 5 , - 9 }, - 2 },
new object [] { new int []{ 1 }, 1 },
new object [] { new int []{ 20 , 20 , 20 , 20 }, 20 },
// new object[] {new int[]{},null}
};
#endregion
}
}
上面的代码提供了4组数据当做测试用例.
运行一下:测试成功通过,如下图.
下面使用TestCaseSource的另一个构造函数
TestCaseSourceAttribute(Type sourceType,
string
sourceName);
写如下测试代码
[Test, TestCaseSource(
typeof
(Class1),
"
LargestTestCases
"
)]
public int TestLargest( int [] arr)
{
return mc.Largest(arr);
}
public int TestLargest( int [] arr)
{
return mc.Largest(arr);
}
数据源类
class
Class1
{
static IEnumerable < TestCaseData > LargestTestCases
{
get
{
yield return new TestCaseData( new int [] { 1 , 2 , 3 , 4 }).Returns( 4 );
yield return new TestCaseData( new int [] { - 2 , - 3 , - 5 , - 9 }).Returns( - 2 );
yield return new TestCaseData( new int [] { 1 , 2 , 0 , - 1 , - 2 }).Returns( 2 );
yield return new TestCaseData( new int [] { 1 }).Returns( 1 );
yield return new TestCaseData( new int [] { 20 , 20 , 20 }).Returns( 20 );
yield return new TestCaseData( new int [] { })
.Throws( typeof (Exception))
.SetName( " 参数传递错误 " )
.SetDescription( " 参数错误 " );
}
}
}
{
static IEnumerable < TestCaseData > LargestTestCases
{
get
{
yield return new TestCaseData( new int [] { 1 , 2 , 3 , 4 }).Returns( 4 );
yield return new TestCaseData( new int [] { - 2 , - 3 , - 5 , - 9 }).Returns( - 2 );
yield return new TestCaseData( new int [] { 1 , 2 , 0 , - 1 , - 2 }).Returns( 2 );
yield return new TestCaseData( new int [] { 1 }).Returns( 1 );
yield return new TestCaseData( new int [] { 20 , 20 , 20 }).Returns( 20 );
yield return new TestCaseData( new int [] { })
.Throws( typeof (Exception))
.SetName( " 参数传递错误 " )
.SetDescription( " 参数错误 " );
}
}
}
运行一下:测试结果如下
显而易见,TestCaseSource不仅可以提供多个测试用例进行测试,同时也把测试代码和测试数据有效地分离,
,便于管理和更新测试数据。
但是,也有一个问题。就是每次修改数据后都要进行编译才能更新数据。效率不高。
Question:能否把数据存放在XML文件里,定义好数据的Type和Value,让程序动态加载、初始化数据,然后传给测试程序。
这样我就可以直接改XML里的数据,而不用管代码如何如何了。
希望各位路过的博客园大大们给小弟指点一下。
参考资料:NUnit Documentation