您是否曾經(jīng)嘗試過(guò)自動(dòng)化 API 測(cè)試但不知道如何開始?本教程將幫助您從頭開始使用 NUNit 和 C# 自動(dòng)化 API 測(cè)試,因?yàn)榱私鈱⒁獪y(cè)試的 API、測(cè)試 API 時(shí)的主要問題、設(shè)置以及如何自動(dòng)化測(cè)試。
目錄
自動(dòng)化之前
在陳述自動(dòng)化之前,我們需要了解將要測(cè)試什么以及我們將進(jìn)行哪種類型的測(cè)試。
當(dāng)您需要自動(dòng)化項(xiàng)目時(shí),會(huì)使用很多方法,在本教程中,我們將使用測(cè)試金字塔來(lái)確定我們將自動(dòng)化的測(cè)試類型。
基本上,測(cè)試金字塔是一個(gè)框架,可以幫助開發(fā)人員和 QA 創(chuàng)建高質(zhì)量的軟件,并幫助團(tuán)隊(duì)構(gòu)建更可靠的測(cè)試套件。
測(cè)試金字塔通過(guò)三個(gè)級(jí)別運(yùn)行:
單元測(cè)試:它們是金字塔廣告的基礎(chǔ),負(fù)責(zé)測(cè)試各個(gè)組件或功能,以驗(yàn)證它們?cè)诟綦x條件下是否按預(yù)期工作。
集成測(cè)試:從根本上來(lái)說(shuō),它們測(cè)試功能如何與外部依賴項(xiàng)進(jìn)行通信。
端到端:測(cè)試以確保整個(gè)應(yīng)用程序是否按預(yù)期工作。
對(duì)于 API 測(cè)試,我們將自動(dòng)化金字塔的第二層,即集成測(cè)試。在測(cè)試此級(jí)別時(shí),我們需要記?。?/p>
由于與外部依賴項(xiàng)的集成,此測(cè)試的運(yùn)行速度可能比單元測(cè)試慢
我們需要一個(gè)預(yù)生產(chǎn)環(huán)境來(lái)運(yùn)行它們。
了解將要測(cè)試的 API
在本教程中,我們將使用 FakeAPI 和返回 Books 的端點(diǎn)。
關(guān)于API:
基本網(wǎng)址:“ https://fakerestapi.azurewebsites.net ”
正文響應(yīng)格式:
{ "id": 1, "title": "Book 1", "description": "Lorem nonumy iusto takimata ut sit ut consetetur erat sanctus sed vel ut labore nulla et consetetur sed nonumy. Adipiscing hendrerit gubergren elitr at no\n", "pageCount": 100, "excerpt": "Nonumy duo no. Clita invidunt hendrerit lorem ea sed ipsum. Nonummy labore ut at lorem feugiat erat sit dolor sit et velit. Dolore sit lorem diam sit ipsum at stet elit kasd et et.\nJusto te accusam amet ea aliquyam iriure at et ea nihil esse nibh volutpat eros et. Eu consequat exerci voluptua dolor nonumy erat invidunt consetetur vel takimata veniam at zzril kasd dolor amet diam. Lorem kasd ipsum. Quod justo minim takimata dolor dolore sanctus clita diam dolore duis voluptua nonumy nibh cum velit tempor no. Velit suscipit diam ea sanctus consetetur dignissim magna dolor.\n", "publishDate": "2023-09-05T15:30:40.6574078+00:00" },
認(rèn)證:無(wú)
可用方法:
獲取所有書籍
搜索特定書籍
創(chuàng)建一本新書
更新一本書
刪除一本書
測(cè)試場(chǎng)景
現(xiàn)在我們定義了測(cè)試的級(jí)別并了解了 API,我們可以開始編寫測(cè)試了。在集成級(jí)別測(cè)試 API 時(shí),我們需要考慮:
狀態(tài)碼
身體反應(yīng)內(nèi)容
API 是否能夠驗(yàn)證查詢參數(shù)或正文內(nèi)容
因此,對(duì)于這個(gè) API,我們將自動(dòng)執(zhí)行以下測(cè)試:
測(cè)試 | 預(yù)期結(jié)果 |
---|---|
搜索書籍 | 狀態(tài)碼200 |
搜索書籍 | 有效的身體反應(yīng) |
搜索一本書 | 狀態(tài)碼200 |
創(chuàng)建一本書 | 狀態(tài)碼200 |
更新一本書 | 狀態(tài)碼200 |
刪除一本書 | 狀態(tài)碼200 |
設(shè)置
.NET 7.0.307
NUnit 3.13.3
FluentAssertions 6.12.0
RestSharp 110.2.0
要安裝依賴項(xiàng),我們將使用 Nuget 包管理,在 IDE( Visual Studio或Rider )上創(chuàng)建項(xiàng)目后,轉(zhuǎn)到:
Visual Studio:工具 > 管理 Nuget 包 > 管理解決方案的 Nuget 包
Rider:工具 > Nuget > 管理項(xiàng)目的 Nuget 包并安裝項(xiàng)目的依賴項(xiàng)。
以下是英文原文
Visual Studio: Tools > Manage Nuget Packages > Manage Nuget Packages for Soluction
Rider: Tools > Nuget > Manage Nuget Packages for Project And install the dependencies for the project.
第一個(gè)場(chǎng)景的自動(dòng)化 - GET 方法
創(chuàng)建一個(gè)名為FakeApiTests.cs的新文件,在該文件中,我們將編寫測(cè)試。
之后,我們需要為此類導(dǎo)入我們的依賴項(xiàng):
using System.Net; using FluentAssertions; using RestSharp;
為了幫助我們自動(dòng)化測(cè)試,我們將使用TDD方法,步驟是:
創(chuàng)建失敗的測(cè)試
讓這個(gè)測(cè)試通過(guò)
重構(gòu)
創(chuàng)建一個(gè)會(huì)失敗的測(cè)試
可以向我們返回錯(cuò)誤的測(cè)試是:調(diào)用所有書籍的 GET API 并等待狀態(tài)代碼為 400,而不是 200。
首先,我們將創(chuàng)建測(cè)試方法:
using System.Net; using System.Text.Json; using FluentAssertions; using RestSharp; public class FakeApiTests { [Test] public void SearchBooks() { } }
該 Test 屬性是將 TestFixture 類中的方法標(biāo)記為測(cè)試的一種方法。它通常用于簡(jiǎn)單(非參數(shù)化)測(cè)試,但也可以應(yīng)用于參數(shù)化測(cè)試,而不會(huì)導(dǎo)致生成任何額外的測(cè)試用例。您可以在此處查看更多符號(hào)。
在自動(dòng)化測(cè)試時(shí),我們使用3A的方法:
安排:設(shè)置完成請(qǐng)求的所有信息
行動(dòng):提出請(qǐng)求
斷言:驗(yàn)證響應(yīng)
從安排開始,我們需要告知 RestSharp 請(qǐng)求將使用什么。首先,我們將使用 RestClient 類創(chuàng)建客戶端:
RestClient client = new RestClient(baseUrl);
之后,我們將使用 RestRequest 類傳遞有關(guān)請(qǐng)求的信息。此時(shí),如果有必要,我們必須告知請(qǐng)求的 url 和附加信息:
RestRequest restRequest = new RestRequest(baseUrl, Method.Get);
現(xiàn)在我們可以進(jìn)行測(cè)試:
RestResponse restResponse = client.Execute(restRequest);
最后,我們可以使用這個(gè)restResponse來(lái)進(jìn)行驗(yàn)證:
restResponse.Should().NotBeNull(); restResponse.StatusCode.Should().Be(HttpStatusCode.BadRequest);
所以,現(xiàn)在我們的測(cè)試如下所示:
using System.Net; using System.Text.Json; using FluentAssertions; using RestSharp; public class FakeApiTests { [Test] public void SearchBooks() { var baseUrl = "https://fakerestapi.azurewebsites.net/api/v1/Books"; RestClient client = new RestClient(baseUrl); RestRequest restRequest = new RestRequest(baseUrl, Method.Get); RestResponse restResponse = client.Execute(restRequest); restResponse.Should().NotBeNull(); restResponse.StatusCode.Should().Be(HttpStatusCode.BadRequest); } }
讓這個(gè)測(cè)試通過(guò)
為了使我們的測(cè)試通過(guò),我們只需要更新斷言:
using System.Net; using System.Text.Json; using FluentAssertions; using RestSharp; public class FakeApiTests { [Test] public void SearchBooks() { var baseUrl = "https://fakerestapi.azurewebsites.net/api/v1/Books"; RestClient client = new RestClient(baseUrl); RestRequest restRequest = new RestRequest(baseUrl, Method.Get); RestResponse restResponse = client.Execute(restRequest); restResponse.Should().NotBeNull(); restResponse.StatusCode.Should().Be(HttpStatusCode.OK); } }
重構(gòu)
現(xiàn)在,是時(shí)候進(jìn)行重構(gòu)了。進(jìn)行重構(gòu)的最好方法是思考我們可以在測(cè)試期間重用什么。我們知道我們需要為每個(gè)測(cè)試執(zhí)行請(qǐng)求,因此,我們可以從測(cè)試類中取出此方法并創(chuàng)建一個(gè)新方法,名為“Requests.cs”:
using RestSharp; public class RequestClass { var baseUrl = "https://fakerestapi.azurewebsites.net/api/v1/Books"; public RestResponse GetFakeApiRequest() { RestClient client = new RestClient(baseUrl); RestRequest restRequest = new RestRequest(baseUrl, Method.Get); RestResponse restResponse = client.Execute(restRequest); return restResponse; } }
這個(gè)新方法將返回我們的restResponse,并且在更新測(cè)試類時(shí),我們需要在使用它之前實(shí)例化該類:
using System.Net; using System.Text.Json; using FluentAssertions; using RestSharp; public class FakeApiTests { RequestClass request = new RequestClass(); [Test] public void SearchBooks() { RestResponse response = request.GetFakeApiRequest(); restResponse.Should().NotBeNull(); restResponse.StatusCode.Should().Be(HttpStatusCode.OK); } }
之后,我們的測(cè)試通過(guò),我們可以為其他方法重現(xiàn)相同的步驟。
自動(dòng)化其他場(chǎng)景 - POST、PUT 和 DELETE 方法
POST方式
創(chuàng)建書籍時(shí),我們將使用 POST 方法,為此,我們需要傳遞正文請(qǐng)求。
首先,我們將創(chuàng)建一個(gè)名為FakeApiEntities.cs的新類,在該類中,我們將創(chuàng)建一個(gè)具有主體請(qǐng)求/響應(yīng)屬性的對(duì)象。
為什么要使用它?如果將來(lái) API 發(fā)生變化,更改將會(huì)更加容易。
_
using System.Text.Json.Serialization; public class FakeApiEntities { [JsonPropertyName("id")] public int? Id { get; set; } [JsonPropertyName("title")] public string Title { get; set; } [JsonPropertyName("description")] public string Description { get; set; } [JsonPropertyName("pageCount")] public int PageCount { get; set; } [JsonPropertyName("excerpt")] public string Excerpt { get; set; } [JsonPropertyName("publishDate")] public string PublishDate { get; set; } }
接下來(lái),在Request.cs類中創(chuàng)建將發(fā)出請(qǐng)求的新方法:
public RestResponse PostFakeApiRequest() { RestClient client = new RestClient(baseUrl); var body = BuildBodyRequest(); RestRequest restRequest = new RestRequest(baseUrl, Method.Post); restRequest.AddBody(body, ContentType.Json); RestResponse restResponse = client.Execute(restRequest); return restResponse; }
調(diào)用方法 BuildBodyRequest 來(lái)生成請(qǐng)求體,我們使用 FakeApiEntities 類來(lái)生成一個(gè)新對(duì)象:
public static FakeApiEntities BuildBodyRequest() { return new FakeApiEntities { Id = 100, Title = "Test Book", Description = "Mussum Ipsum, cacilds vidis litro abertis. Quem num gosta di mim que vai ca?á sua turmis!", Excerpt = "uem num gosta di mim que vai ca?á sua turmis!", PageCount = 100, PublishDate = "2023-09-03T13:50:32.6884665+00:00" }; }
Test.cs 文件中的測(cè)試方法為:
[Test] public void CreateABook() { RestResponse response = request.PostFakeApiRequest(); response.StatusCode.Should().Be(HttpStatusCode.OK); response.Content.Should().NotBeNull(); var bodyContent = JsonSerializer.Deserialize<FakeApiEntities>(response.Content); bodyContent.Id.Should().NotBeNull(); bodyContent.Description.Should().NotBeNull(); bodyContent.Title.Should().NotBeNull(); }
為了驗(yàn)證正文響應(yīng)的內(nèi)容,我反序列化了響應(yīng)的內(nèi)容以做出斷言。
PUT方法
對(duì)于 PUT 方法,我們基本上將使用相同的步驟,但是存在一些差異。
首先,我們將更改負(fù)責(zé)生成正文請(qǐng)求的方法。更新書籍的端點(diǎn)使用相同的正文,但是,我們需要在 url 中發(fā)送的正文請(qǐng)求中傳遞相同的 Id。這就是為什么我們不強(qiáng)制使用此參數(shù)并使用三元運(yùn)算符來(lái)確保使用此主體的其他測(cè)試不會(huì)失?。?br/>
public static FakeApiEntities BuildBodyRequest(int? id=null) { return new FakeApiEntities { Id = id ?? 100, Title = "Test Book", Description = "Mussum Ipsum, cacilds vidis litro abertis. Quem num gosta di mim que vai ca?á sua turmis!", Excerpt = "uem num gosta di mim que vai ca?á sua turmis!", PageCount = 100, PublishDate = "2023-09-03T13:50:32.6884665+00:00" }; }
對(duì)于負(fù)責(zé)發(fā)出請(qǐng)求的方法,我們將對(duì) RestRequest 類使用的 url 進(jìn)行更改,以接受將更新的書籍的 Id:
public RestResponse PutFakeApiRequest(int id) { RestClient client = new RestClient(baseUrl); var body = BuildBodyRequest(id); RestRequest restRequest = new RestRequest( $"{baseUrl}/{id}", Method.Put); restRequest.AddBody(body, ContentType.Json); RestResponse restResponse = client.Execute(restRequest); return restResponse; }
測(cè)試類:
[Test] public void UpdateABook() { RestResponse response = request.PutFakeApiRequest(15); response.StatusCode.Should().Be(HttpStatusCode.OK); response.Content.Should().NotBeNull(); var bodyContent = JsonSerializer.Deserialize<FakeApiEntities>(response.Content); bodyContent.Id.Should().NotBeNull(); bodyContent.Id.Should().Be(15); bodyContent.Description.Should().NotBeNull(); bodyContent.Title.Should().NotBeNull(); }
刪除方法
DELETE方法,與GET方法類似,我們將允許該方法接收ID并更改RestRequest類調(diào)用的方法:
public RestResponse DeleteFakeApiRequest(int id) { RestClient client = new RestClient(baseUrl); var body = BuildBodyRequest(id); RestRequest restRequest = new RestRequest( $"{baseUrl}/{id}", Method.Delete); restRequest.AddBody(body, ContentType.Json); RestResponse restResponse = client.Execute(restRequest); return restResponse; }
測(cè)試類:
[Test] public void DeleteABook() { RestResponse response = request.DeleteFakeApiRequest(15); response.StatusCode.Should().Be(HttpStatusCode.OK); response.Content.Should().NotBeNull(); }
結(jié)論
在這個(gè)教程中,我分享了我使用框架文檔學(xué)習(xí) NUnit 和 C# 并在工作中進(jìn)行實(shí)驗(yàn)的所有知識(shí),您可以在此處查看完整(https://github.com/aliciamarianne1507/LearningNUnit)的項(xiàng)目。我希望這些內(nèi)容對(duì)您有用,如有任何問題,請(qǐng)與我聯(lián)系!文章來(lái)源:http://www.zghlxwxcb.cn/article/378.html
文章來(lái)源地址http://www.zghlxwxcb.cn/article/378.html
到此這篇關(guān)于NUnit 和 C# - 從零開始自動(dòng)化你的 API 測(cè)試教程的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!