Web應用程序開發教程 - 第三章:集成測試
關於本教程
在本系列教程中,您將構建一個名稱Acme.BookStore
的用於管理書籍及其作者列表的基於 ABP 的程序。是使用以下技術開發的:
- Entity Framework Core 為ORM 提供程序。
- Angular做為 UI 框架。
本教程分為以下部分:
- 第 1 部分:創建服務器端
- 第 2 部分:圖書列表頁面
- 第 3 部分:創建、更新和刪除書籍
- 第 4 部分:集成測試
- 第 5 部分:授權
- 第 6 部分:作者:領域層
- 第 7 部分:作者:數據庫集成
- 第 8 部分:作者:應用程序層
- 第 9 部分:作者:用戶界面
- 第 10 部分:圖書到作者的關係
下載源碼
本教程根據你的UI和數據庫首選項有多個版本,我們準備了一個模型下載的源碼組件:
解決方案中的測試項目
這涉及到了服務器端測試。解決方案還有很多測試項目:
各個項目用於測試相關的應用程序項目。測試項目使用以下庫進行測試:
- xunit 作為主測試框架。
- Shoudly 作為斷言庫。
- NSubstitute 作為模擬庫。
測試項目配置為使用SQLite 內存作為數據庫。創建一個單獨的數據庫實例並使用數據生成系統進行初始化數據,為每個單獨的數據庫實例準備一個新的數據庫。
添加測試數據
如果你已經按照第一個部分中的描述創建了數據種子貢獻者,則相同的數據用於測試中可用。因此你可以跳過此部分。如果你還沒有創建數據種子貢獻者(DataSeedContributor),可以使用BookStoreTestDataSeedContributor
來為要在以下測試中使用的相同數據提供種子。
測試 BookAppService
在Acme.BookStore.Application.Tests
項目中創建一個有名BookAppService_Tests
的測試類:
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Xunit;
namespace Acme.BookStore.Books
{
public class BookAppService_Tests : BookStoreApplicationTestBase
{
private readonly IBookAppService _bookAppService;
public BookAppService_Tests()
{
_bookAppService = GetRequiredService<IBookAppService>();
}
[Fact]
public async Task Should_Get_List_Of_Books()
{
//Act
var result = await _bookAppService.GetListAsync(
new PagedAndSortedResultRequestDto()
);
//Assert
result.TotalCount.ShouldBeGreaterThan(0);
result.Items.ShouldContain(b => b.Name == "1984");
}
}
}
- 測試方法直接
Should_Get_List_Of_Books
使用BookAppService.GetListAsync
方法來獲取用戶列表,並執行檢查。 - 我們可以安全地檢查“1984”這本書的名稱,因為我們知道這本書可以在數據庫中找到,我們已經將其添加到衍生數據中。
新增測試方法,創建一個合法書籍實體的場景:
[Fact]
public async Task Should_Create_A_Valid_Book()
{
//Act
var result = await _bookAppService.CreateAsync(
new CreateUpdateBookDto
{
Name = "New test book 42",
Price = 10,
PublishDate = System.DateTime.Now,
Type = BookType.ScienceFiction
}
);
//Assert
result.Id.ShouldNotBe(Guid.Empty);
result.Name.ShouldBe("New test book 42");
}
新增測試方法,創建一個公開書籍實體失敗的場景:
[Fact]
public async Task Should_Not_Create_A_Book_Without_Name()
{
var exception = await Assert.ThrowsAsync<AbpValidationException>(async () =>
{
await _bookAppService.CreateAsync(
new CreateUpdateBookDto
{
Name = "",
Price = 10,
PublishDate = DateTime.Now,
Type = BookType.ScienceFiction
}
);
});
exception.ValidationErrors
.ShouldContain(err => err.MemberNames.Any(mem => mem == "Name"));
}
- 因為
Name
是空值,ABP 拋出了一個AbpValidationException
異常。
最終的測試類如下所示:
using System;
using System.Linq;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Validation;
using Xunit;
namespace Acme.BookStore.Books
{
public class BookAppService_Tests : BookStoreApplicationTestBase
{
private readonly IBookAppService _bookAppService;
public BookAppService_Tests()
{
_bookAppService = GetRequiredService<IBookAppService>();
}
[Fact]
public async Task Should_Get_List_Of_Books()
{
//Act
var result = await _bookAppService.GetListAsync(
new PagedAndSortedResultRequestDto()
);
//Assert
result.TotalCount.ShouldBeGreaterThan(0);
result.Items.ShouldContain(b => b.Name == "1984");
}
[Fact]
public async Task Should_Create_A_Valid_Book()
{
//Act
var result = await _bookAppService.CreateAsync(
new CreateUpdateBookDto
{
Name = "New test book 42",
Price = 10,
PublishDate = System.DateTime.Now,
Type = BookType.ScienceFiction
}
);
//Assert
result.Id.ShouldNotBe(Guid.Empty);
result.Name.ShouldBe("New test book 42");
}
[Fact]
public async Task Should_Not_Create_A_Book_Without_Name()
{
var exception = await Assert.ThrowsAsync<AbpValidationException>(async () =>
{
await _bookAppService.CreateAsync(
new CreateUpdateBookDto
{
Name = "",
Price = 10,
PublishDate = DateTime.Now,
Type = BookType.ScienceFiction
}
);
});
exception.ValidationErrors
.ShouldContain(err => err.MemberNames.Any(mem => mem == "Name"));
}
}
}
打開測試資源管理器(測試 -> Windows -> 測試資源管理器)並執行所有測試:
恭喜你,綠色圖標表示測試已成功通過!
下一章
查看本教程的下一章。