Multiple Test Data(DataRow) on MSTest

介紹 MSTest V2 的新功能 - DataRow Support

banner

MSTest V2從 2016 開始開放測試後有不少下載量,而.NET Core也是將 MSTest V2 列為預設的支援測試框架之一。

以往 MSTest 與其他測試框架:xUnit, NUnit比較起來,差別最大的就是 DataRow Support。

而在MSTest V2的版本中已經將此功能提供出來,今天就來稍微介紹一下該功能與如何透過他更有效率的撰寫我們的測試程式。

Write a Test

如何建立MSTest的方式我們以.NET Core的開發為環境,可以參考ASP.NET Core play with MSTest

而今天我們假設寫了一個很簡單的程式如下:

TestObject.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;

namespace app
{
public class TestObject
{
public static int TestMethod(int value1, int value2, bool isAllowNegative)
{
var result = value1-value2;
if(result<0&&!isAllowNegative){
return 0;
}
return result;
}
}
}

根據上面的程式我們寫了以下的測試案例:

  • 驗證數值相減(1-2),且允許負數的情況下結果為 -1
  • 驗證數值相減(2-1),且允許負數的情況下結果為 1
  • 驗證數值相減(1-2),且不允許負數的情況下結果為 0

Write Test Without DataRow

在我們不用DataRow的方式撰寫實際的測試案例程式碼為下:

UnitTest.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using Microsoft.VisualStudio.TestTools.UnitTesting;
using app;
namespace test
{
[TestClass]
public class UnitTest
{
[TestMethod]
public void TestMethod_Single_1_2_iSAllowNegativeIsTrue()
{
// arrange
var var1 = 1;
var var2 = 2;
var iSAllowNegative = true;
var expected = -1;
// act
var result = TestObject.TestMethod(var1,var2,iSAllowNegative);
// assert
Assert.AreEqual(expected,result);
}

[TestMethod]
public void TestMethod_Single_2_1_iSAllowNegativeIsTrue()
{
// arrange
var var1 = 2;
var var2 = 1;
var iSAllowNegative = true;
var expected = 1;
// act
var result = TestObject.TestMethod(var1,var2,iSAllowNegative);
// assert
Assert.AreEqual(expected,result);
}

[TestMethod]
public void TestMethod_Single_1_2_iSAllowNegativeIsFalse()
{
// arrange
var var1 = 1;
var var2 = 2;
var iSAllowNegative = false;
var expected = 0;
// act
var result = TestObject.TestMethod(var1,var2,iSAllowNegative);
// assert
Assert.AreEqual(expected,result);
}
}
}

此時我們可以透過下方指令執行該測試:

dotnet test --filter FullyQualifiedName~TestMethod_Single

test_run_single

這邊可以發現我們的程式碼其實重複了三個區塊,只有數值跟期望結果是不一樣的。

Write Test With DataRow

而當我們改用DataRow後則為下面的程式碼:

UnitTest_DataRow.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using Microsoft.VisualStudio.TestTools.UnitTesting;
using app;
namespace test
{
[TestClass]
public class UnitTest_DataRow
{
[DataTestMethod]
[DataRow(1, 2,true, -1)]
[DataRow(2, 1,true, 1)]
[DataRow(1, 2,false, 0)]
public void TestMethod_DataRow(int var1,int var2, bool iSAllowNegative, int expected)
{
// act
var result = TestObject.TestMethod(var1,var2,iSAllowNegative);
// assert
Assert.AreEqual(expected,result);
}
}
}

此時我們可以透過下方指令執行該測試:

dotnet test --filter FullyQualifiedName~TestMethod_DataRow

test_run_datarow

從上面我們即可看到DataRow帶來的程式碼的簡化與好處!

而如果要看所有當前的測試案例,我們可以透過 -t 參數

dotnet test -t

test_list

References