目錄
- 前言
- 單元測驗
- xUnit
- Fact
- Theory
- 控制器
- 小結
- 附錄
前言
從開始敲代碼到現在,不停地都是在喊著記得做測驗,記得自測,測驗人員打回來扣你money之類的,剛開始因為心疼錢(當然還是為了代碼質量),就老老實實自己寫完自己跑一遍,沒有流程沒有規劃沒有測驗檔案,就是自己整理一組資料跑一遍,最后依然還是讓測驗人員老老實實把一大堆測驗問題扔給你,
單元測驗
首先,還是來聊聊為啥要搞測驗吧,
- 測驗有助于代碼整體健壯性,覆寫測驗、壓力測驗都是為了全方位多角度更快更好為用戶服務,
- 測驗有助于提高程式猿的積極性以及引起自身的重視,畢竟一個坑栽一遍就夠了,兩次也能容忍,再三再四再五怕是要被搞,同時這也是自我提高的一種手段吧,
- 軟體開發流程收尾的作業就是測驗,繞不過,畢竟驗收才是最終目標,達到效果才能獲得應有的,
好了,聊完這些,當然我也不是專業測驗人員,肯定不會給個測驗檔案模板,喏,照著這個規范起來,我主要是要鼓搗下我之前一直想試試的單元測驗,這個自動化測驗的手段之一,一直想試試但是一直都放著,
在MSTest,NUnit,xUint這三個中讓我稍微猶豫了下,不過三七二十八管他呢,隨便來個吧,就選了xUnit,當然MSTest是官方的,支持度應該高點兒,但是這不是我們該猶豫抉擇的地方,
xUnit
首先,我們新建一個專案April.Test,

Fact
新建之后,我們看到有個默認的 [Fact],
這個就是測驗的標準格式了,如果我們不需要測驗資料的話,就是在這個標簽下的方法做斷言,簡單舉個例子吧,
[Fact]
public void TestEqual()
{
int a = 10, b = 20;
Assert.Equal(30, Add(a, b));
}
private int Add(int a, int b)
{
return a + b;
}
敲下Assert之后,發現斷言好多方法,這里也就不一一說明了,感覺方法名起的都挺明白的,這里就不過多描述了,代碼中也有些測驗示例,地址在文末給出,
Theory
我們在上面的代碼可以看到,所有的資料都是自己定好的,如果我想自己做引數傳入測驗怎么搞呢,這時候就要用到 [Theory] 這個標簽以及 [InlineData] 了,標簽是為了更好的區分方法的型別(個人理解),來看下這種引數傳遞的測驗怎么搞吧,
[Theory]
[InlineData(new object[] { 1, 2, 3, 4 },1)]
[InlineData(new object[] { "t", "e", "s", "t" }, "t")]
public void TestContains(object[] objs,object obj)
{
Assert.Contains(obj, objs);
}
當然我們也可以使用自定義陣列來做測驗資料源,這里我起初以為可以傳任意型別引數,但是MemberData只支持object[],
[Theory]
[MemberData(nameof(tempDatas))]
public void TestData(int a, int b)
{
int result = a + b;
Assert.True(result == Add(a, b));
}
public static IEnumerable<object[]> tempDatas
{
get
{
yield return new object[] { 1, 2 };
yield return new object[] { 5, 7 };
yield return new object[] { 12, 12 };
}
}
控制器
在之前鼓搗單元測驗的時候,我一直想一個問題,如果只是這種操作的話,那測驗有何意義,但是后來發現,原來單元測驗比我以為能做的多得多,所以,學習是個不停的行程,走的多了,風景也就多了,
這里可以引入一個流程,在我們測驗自己的工程的時候,我們需要三步來做完單個的測驗,
- Arrange(準備作業)
- Act(實作方法)
- Assert(斷言結果)
在測驗之前,我們需要在當前工程引入一個Moq,至于為什么用這個呢,就跟vue一樣我們需要模擬(雖說mock跟Moq還不是那么類似),總不可能我們單元測驗引入了orm來實際操作資料庫吧(當然測驗庫這個也是可行的),所以我們需要模擬介面的實作類及方法,

引入完,我們將April.WebApi引入到當前工程,之后我們創建一個Values的介面測驗類ValuesControllerTest,然后測驗方法如下:
[Fact]
public void TestGet()
{
// Arrange
var mockRepo = new Mock<IStudentService>();
var controller = new ValuesController(mockRepo.Object);
// Act
var result = controller.Get();
// Assert
Assert.Equal(new string[] { "value1", "" }, result.Value);
}
這里注意下,對應介面的方法我是都注釋的,最終只有回傳了字串陣列,因為對應介面中的方法都需要初始化,那么我們來測驗下獲取資料的介面,看下這個Moq的用法吧,首先我們需要初始化Mock來實作對應介面,然后我們通過實作對應方法來模擬獲取資料,
[Theory]
[InlineData(1)]
public void TestGetByID(int id)
{
var mockRepo = new Mock<IStudentService>();
mockRepo.Setup(repo => repo.GetList(s => s.ID == 38).ToList())
.Returns(GetList());
var controller = new ValuesController(mockRepo.Object);
var result = controller.Get(id);
Assert.NotNull(result);
Assert.Contains("大洛陽", result.Value);
}
private List<StudentEntity> GetList()
{
List<StudentEntity> entities = new List<StudentEntity>();
entities.Add(new StudentEntity()
{
ID = 1,
Name = "小明",
Number = "123456",
Age = 19,
Sex = 1,
Address = "大洛陽"
});
entities.Add(new StudentEntity()
{
ID = 2,
Name = "小紅",
Number = "456789",
Age = 18,
Sex = 0,
Address = "大洛陽"
});
return entities;
}
寫到這我發現,我在引入WebApi的時候,好像已經把幾個工程都已經引入進來,這個不知道合適不合適,
小結
寫到這里,基本上單元測驗這塊兒也簡單了走了一遍,至于具體在業務中如何實作,還是想著需要結合個小專案來實踐下,東西走通個demo只能說明可行,走通不同體量的工程才能說明可用,包括后續的集成測驗,壓力測驗,自動化測驗也會一點點兒的開始鼓搗,路漫漫啊,
附錄
代碼地址:April.WebApi
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/96203.html
標籤:.NET Core
上一篇:c#撰寫web后端
下一篇:如何實作自動識別設備的串口
