首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >层次化"OneTimeSetUp“方法

层次化"OneTimeSetUp“方法
EN

Stack Overflow用户
提问于 2018-11-07 03:19:50
回答 2查看 349关注 0票数 2

好的,我已经写了一些单元测试来测试API。每当我需要运行这些测试时,我首先需要登录api来获取令牌。首先,这就是我写OneTimeSetUp的方式。

因此,OneTimeSetUp被调用,我登录,一个共享字段存储令牌,每个测试被称为测试一个不同的api端点。

现在问题来了。我们已经决定对响应中的各个字段进行单独的测试,这样我们就可以在出现问题时查看到底是什么(并且不会失败)。因此,我们将每个端点拆分成它自己的测试。

现在,调用OneTimeSetUp,它登录并调用端点,存储结果,然后启动所有测试,测试它们的一小部分。

问题是,登录需要时间,并且没有逻辑原因为什么所有单独的测试不能只使用相同的登录详细信息。有没有进一步细分测试/添加额外测试级别的方法?如果我们能得到如下的测试结果,那就太好了。

ApiTests <--- shared sign-in at this level - Endpoint 1 <--- call the endpoint at this level - Field 1 \ - Field 2 --- individual test results here - Field 3 / - Endpoint 2 <--- call the endpoint at this level - Field a \ - Field b --- individual test results here - Field c /

EN

回答 2

Stack Overflow用户

发布于 2018-11-07 04:22:40

您可以将测试类分组到相同的命名空间中,然后添加一个用SetupFixture属性标记的附加类。这将在每个命名空间中只运行一次初始化代码。(不要与"TestFixtureSetUp“属性混淆,该属性自NUnit v3以来已被标记为已过时。谢谢你的评论,我最初把它搞混了。)

https://github.com/nunit/docs/wiki/SetUpFixture-Attribute

代码示例(像往常一样,您可以自由地将每个类放入单独的代码文件中):

代码语言:javascript
复制
using System.Diagnostics;
using NUnit.Framework;

namespace Test
{
    [SetUpFixture]
    public class SharedActions
    {
        [OneTimeSetUp]
        public void SharedSignIn()
        {
            Debug.WriteLine("Signed in.");
        }

        [OneTimeTearDown]
        public void SharedSignOut()
        {
            Debug.WriteLine("Signed out.");
        }
    }

    [TestFixture]
    public class FirstEndpointTests
    {
        [Test]
        public void FirstEndpointTest()
        {
            Debug.WriteLine("Test for Endpoint A");
        }
    }

    [TestFixture]
    public class SecondEndpointTests
    {
        [Test]
        public void SecondEndpointTest()
        {
            Debug.WriteLine("Test for Endpoint B");
        }
    }
}

当您“调试所有”测试时,以下输出将出现在调试窗口中:

已登录。终结点A测试终结点B的测试已注销。

票数 2
EN

Stack Overflow用户

发布于 2018-11-07 06:53:45

这里有一种可能的方法来实现这一点。

如果您有一个公共基类(正如您的描述所说的那样),您可以创建一个受保护的惰性类来获取令牌,如下面的示例所示

代码语言:javascript
复制
public class ApiTestsBase
{
    protected static Lazy<string> TokenLazy = new Lazy<string>(() =>
                                                             {
                                                                 // Log in and get your API token
                                                                 Console.WriteLine("Logging into API to get token. You should only see this message on the first test that runs"); 
                                                                 return "DEADBEEF";
                                                             });

}

[TestFixture]
public class EndpointATests : ApiTestsBase
{
    private string GetResultFromEndPoint()
    {
        // Call endpoint with token from TokenLazy.Value
        Console.WriteLine($"Calling EndpointA with token {TokenLazy.Value}");
        return "PayloadA";
    }

    [Test]
    public void Test1()
    {
        var payload = this.GetResultFromEndPoint();
        // Assert things about payload
    }

}

[TestFixture]
public class EndpointBTests : ApiTestsBase
{
    private string GetResultFromEndPoint()
    {
        // Call endpoint with token from TokenLazy.Value
        Console.WriteLine($"Calling EndpointB with token {TokenLazy.Value}");
        return "PayloadB";
    }

    [Test]
    public void Test1()
    {
        var payload = this.GetResultFromEndPoint();
        // Assert things about payload
    }

}

现在我使用的是字符串类型,但您可以使用任何与您的情况相关的请求、响应和令牌类型。我怀疑您也可以有一点创造性地将GetResultFromEndPoint调用移动到基类,并使用抽象方法或属性来填充特定于端点的细节,但您还没有共享足够的代码让我尝试这样做。

其神奇之处在于static关键字,这意味着每个应用程序域只有一个实例。懒惰只是将创建推迟到它的第一次引用。如果您的测试用例长时间运行,它会变得有点复杂,因为您将需要处理令牌更新,但它仍然可以以类似的方式实现,使用单例类,如果令牌年龄> x,则定期重新进行身份验证。如果您的fixture没有公共基类,也可以使用单例对象来代替上面示例中的静态对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53178594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档