NUnit 和 C# - 从零开始自动化你的 API 测试教程

您是否曾经尝试过自动化 API 测试但不知道如何开始?本教程将帮助您从头开始使用 NUNit 和 C# 自动化 API 测试,因为了解将要测试的 API、测试 API 时的主要问题、设置以及如何自动化测试。

目录


自动化之前

在陈述自动化之前,我们需要了解将要测试什么以及我们将进行哪种类型的测试。
当您需要自动化项目时,会使用很多方法,在本教程中,我们将使用测试金字塔来确定我们将自动化的测试类型。
基本上,测试金字塔是一个框架,可以帮助开发人员和 QA 创建高质量的软件,并帮助团队构建更可靠的测试套件。

测试金字塔

测试金字塔通过三个级别运行:

  • 单元测试:它们是金字塔广告的基础,负责测试各个组件或功能,以验证它们在隔离条件下是否按预期工作。

  • 集成测试:从根本上来说,它们测试功能如何与外部依赖项进行通信。

  • 端到端:测试以确保整个应用程序是否按预期工作。

对于 API 测试,我们将自动化金字塔的第二层,即集成测试。在测试此级别时,我们需要记住:

  • 由于与外部依赖项的集成,此测试的运行速度可能比单元测试慢

  • 我们需要一个预生产环境来运行它们。


了解将要测试的 API

在本教程中,我们将使用 FakeAPI 和返回 Books 的端点。
关于API:

  • 基本网址:“ https://fakerestapi.azurewebsites.net ”

  • 正文响应格式:

{
    "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"
  },
  • 认证:无

  • 可用方法:

    • 获取所有书籍

    • 搜索特定书籍

    • 创建一本新书

    • 更新一本书

    • 删除一本书


测试场景

现在我们定义了测试的级别并了解了 API,我们可以开始编写测试了。在集成级别测试 API 时,我们需要考虑:

  • 状态码

  • 身体反应内容

  • API 是否能够验证查询参数或正文内容

因此,对于这个 API,我们将自动执行以下测试:

测试预期结果
搜索书籍状态码200
搜索书籍有效的身体反应
搜索一本书状态码200
创建一本书状态码200
更新一本书状态码200
删除一本书状态码200

设置

  • .NET 7.0.307

  • NUnit 3.13.3

  • FluentAssertions 6.12.0

  • RestSharp 110.2.0

要安装依赖项,我们将使用 Nuget 包管理,在 IDE( Visual Studio或Rider )上创建项目后,转到:

  • Visual Studio:工具 > 管理 Nuget 包 > 管理解决方案的 Nuget 包

  • Rider:工具 > Nuget > 管理项目的 Nuget 包并安装项目的依赖项。

  • 以下是英文原文

  • 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.


第一个场景的自动化 - GET 方法

创建一个名为FakeApiTests.cs的新文件,在该文件中,我们将编写测试。
之后,我们需要为此类导入我们的依赖项:

using System.Net;
using FluentAssertions;
using RestSharp;

为了帮助我们自动化测试,我们将使用TDD方法,步骤是:

  • 创建失败的测试

  • 让这个测试通过

  • 重构

时分驱动流程

创建一个会失败的测试

可以向我们返回错误的测试是:调用所有书籍的 GET API 并等待状态代码为 400,而不是 200。
首先,我们将创建测试方法:

using System.Net;
using System.Text.Json;
using FluentAssertions;
using RestSharp;

public class FakeApiTests
{
    [Test]
    public void SearchBooks()
    {

    }
}

该 Test 属性是将 TestFixture 类中的方法标记为测试的一种方法。它通常用于简单(非参数化)测试,但也可以应用于参数化测试,而不会导致生成任何额外的测试用例。您可以在此处查看更多符号。

在自动化测试时,我们使用3A的方法:

  • 安排:设置完成请求的所有信息

  • 行动:提出请求

  • 断言:验证响应

从安排开始,我们需要告知 RestSharp 请求将使用什么。首先,我们将使用 RestClient 类创建客户端:

RestClient client = new RestClient(baseUrl);

之后,我们将使用 RestRequest 类传递有关请求的信息。此时,如果有必要,我们必须告知请求的 url 和附加信息:

RestRequest restRequest = new RestRequest(baseUrl, Method.Get);

现在我们可以进行测试:

RestResponse restResponse = client.Execute(restRequest);

最后,我们可以使用这个restResponse来进行验证:

    restResponse.Should().NotBeNull();
    restResponse.StatusCode.Should().Be(HttpStatusCode.BadRequest);

所以,现在我们的测试如下所示:

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);
    }
}

让这个测试通过

为了使我们的测试通过,我们只需要更新断言:

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);
    }
}

重构

现在,是时候进行重构了。进行重构的最好方法是思考我们可以在测试期间重用什么。我们知道我们需要为每个测试执行请求,因此,我们可以从测试类中取出此方法并创建一个新方法,名为“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;
    }

}

这个新方法将返回我们的restResponse,并且在更新测试类时,我们需要在使用它之前实例化该类:

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);
    }
}

之后,我们的测试通过,我们可以为其他方法重现相同的步骤。


自动化其他场景 - POST、PUT 和 DELETE 方法

POST方式

创建书籍时,我们将使用 POST 方法,为此,我们需要传递正文请求。
首先,我们将创建一个名为FakeApiEntities.cs的新类,在该类中,我们将创建一个具有主体请求/响应属性的对象。

为什么要使用它?如果将来 API 发生变化,更改将会更加容易。
_

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; }
}

接下来,在Request.cs类中创建将发出请求的新方法:

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;  
}

调用方法 BuildBodyRequest 来生成请求体,我们使用 FakeApiEntities 类来生成一个新对象:

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 文件中的测试方法为:

[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();  
}

为了验证正文响应的内容,我反序列化了响应的内容以做出断言。

PUT方法

对于 PUT 方法,我们基本上将使用相同的步骤,但是存在一些差异。
首先,我们将更改负责生成正文请求的方法。更新书籍的端点使用相同的正文,但是,我们需要在 url 中发送的正文请求中传递相同的 Id。这就是为什么我们不强制使用此参数并使用三元运算符来确保使用此主体的其他测试不会失败:

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"  
    };  
}

对于负责发出请求的方法,我们将对 RestRequest 类使用的 url 进行更改,以接受将更新的书籍的 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;
}

测试类:

 [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类调用的方法:

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;
}

测试类:

[Test]
public void DeleteABook()
{
    RestResponse response = request.DeleteFakeApiRequest(15);
    response.StatusCode.Should().Be(HttpStatusCode.OK);
    response.Content.Should().NotBeNull();
}

结论

在这个教程中,我分享了我使用框架文档学习 NUnit 和 C# 并在工作中进行实验的所有知识,您可以在此处查看完整(https://github.com/aliciamarianne1507/LearningNUnit)的项目。我希望这些内容对您有用,如有任何问题,请与我联系!


文章来源地址https://www.toymoban.com/diary/share/378.html

到此这篇关于NUnit 和 C# - 从零开始自动化你的 API 测试教程的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/share/378.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2023年10月11日 09:36
下一篇 2023年10月11日 15:48

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包