我需要一些帮助来为我的 API 测试编写自定义断言方法

I need some help writing custom Assertion methods for my API testing

所以我正在做的两个断言是检查应该给我的状态消息 "OK" 我正在检查 API returns 200。但我的问题是每个请求当然和那个响应变量不同。我试图避免编写相同的三行断言,而只调用一个简单的静态方法

HttpWebResponse response = (HttpWebResponse)sd.GetDataType();
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
statusNumber = (int)response.StatusCode;
Assert.AreEqual(200, statusNumber);

所有assert方法都是静态的,所以你可以创建自己的静态方法,在里面使用Assert

public static class AssertExtensions
{
    public static void Assert(YourType sd)
    {
        HttpWebResponse response = (HttpWebResponse)sd.GetDataType();
        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        statusNumber = (int)response.StatusCode;
        Assert.AreEqual(200, statusNumber);
    }
}

然后使用AssertExtensions.Assert(response)

顺便说一句,如果您使用的是 .Net Core,则已经有方法 response.EnsureSuccessStatusCode() 会抛出异常

HTTP 协议仅发送以下字节:“200 OK”

您的代码正在做两件事:

  • 断言请求的响应是“200 OK”。

  • 断言 library 代码正在运行,因为 StatusCode 枚举获得了正确的值。

您可能想避免这样做,我们希望 MS 能满足您的要求,(以及执行此操作的 LOC)

为避免重复该代码,制作一个方法并使用它,您可以尝试:

  • 一个抽象的方法 "BaseTestClass" 你 inherit 来自
  • 一个 Extension Method 用于 HttpWebResponse
  • static method 在某种实用程序上 class。
  • 只是同一个 class 上的私有方法。

我会采用第一种方法,但如果您是编程新手,则可以开始尝试最后一种方法,它可能更容易理解。

编辑

稍微看了一下 HttpResponseMessage reference 我会使用 IsSuccessStatusCode 属性:

Assert.IsTrue(response.IsSuccessStatusCode)

就是这样。但是这会检查响应是否在成功的范围内(200-299),所以也许你需要额外检查代码,那么最初建议的方法之一可能会派上用场。

话不多说,给我看代码:

public static bool IsOk(this HttpWebResponse response) {
    var isOk = response.IsSuccessStatusCode;
    isOk = isOk && response.StatusCode == 200;
    return isOk;
}

在你的 class namespace used 中的 static class 上使用此方法,你可以使用:

Assert.IsTrue(response.IsOk());

这段代码是直接写在这里的,它可能无法按原样运行,但我希望你能理解。

我会做一个助手class来测试它:

public static class HttpWebResponseDebug
{
    public static void Assert(HttpWebResponse response)
    {
        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        statusNumber = (int)response.StatusCode;
        Assert.AreEqual(200, statusNumber);        
    }
}

var response = (HttpWebResponse)sd.GetDataType();
HttpWebResponseDebug.Assert(response);
// do your thing..