【问题标题】:Unit and Integration Test for Azure Function with ServiceBusTrigger使用 ServiceBusTrigger 对 Azure 函数进行单元和集成测试
【发布时间】:2020-07-06 04:01:55
【问题描述】:

我有一个由 Azure 服务总线队列触发的 Azure 函数。

函数如下。

  1. 如何对这个 Run 方法进行单元测试?
  2. 以及如何通过从AddContact 触发器开始、检查方法中的逻辑以及使用输出绑定发送到 blob 的数据来完成集成测试?
    public static class AddContactFunction
    {
        [FunctionName("AddContactFunction")]
        public static void Run([ServiceBusTrigger("AddContact", Connection = "AddContactFunctionConnectionString")]string myQueueItem, ILogger log)
        {
            log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        }
    }

【问题讨论】:

    标签: unit-testing azure-functions azure-servicebus-queues


    【解决方案1】:

    我也有同样的疑问。 添加单元测试并不太复杂,归根结底,它是一个函数,所以我们要做的就是使用正确的字符串调用 Azure 函数,用于参数string myQueueItem

    添加集成测试需要一些额外的基础工作。在Github project 中,作者使用了来自Azure/azure-functions-host 项目的TestFunctionHost 类。

    我尝试遵循此策略,但设置所有这些所需的代码量高得令人不安。没有多少是有据可查的,有些东西需要开发者使用Azure App Services myGet feed

    我想要一种更简单的方法,幸好我找到了。 Azure Functions 构建在 Azure WebJobs SDK package 之上,并利用其 JobHost 类运行。所以在我们的集成测试中,我们需要做的就是设置这个主机,并告诉它在哪里寻找要加载和运行的 Azure Functions。

    IHost host = new HostBuilder()
            .ConfigureWebJobs()
            .ConfigureDefaultTestHost<CLASS_CONTAINING_THE_AZURE_FUNCTIONS>(webjobsBuilder => {
                webjobsBuilder.AddAzureStorage();
                webjobsBuilder.AddServiceBus();
            })
            .ConfigureServices(services => {
                services.AddSingleton<INameResolver>(resolver);
            })
            .Build();
    
    using (host) {
        await host.StartAsync();
        // ..
    }
    ...
    

    完成后,我们可以向 ServiceBus 发送消息,我们的 Azure Functions 将被触发。一次甚至可以在函数中设置断点进行测试和调试问题!

    我有 blogged about the whole process here,我还创建了一个 github 存储库 at this link,以展示使用 Azure Functions 进行测试驱动开发。

    【讨论】:

    • 这太完美了!我终于能够让它运行起来,并且可以在集成测试期间调试和逐步调试我正在运行的函数!但是由于某种原因, IWebJobsExceptionHandler 没有捕获未处理的异常以使测试失败。我还需要对 dotnet 6 做些什么才能使异常处理正常工作吗?
    • 不确定,没有调查过。
    【解决方案2】:

    如何对这个 Run 方法进行单元测试?

    该方法是静态公共方法。您可以通过调用静态方法AddContactFunction.Run(/* parameters /*) 对其进行单元测试;您不需要服务总线命名空间或消息,因为您的函数希望从 SDK 接收字符串。您可以提供并验证逻辑是否按预期工作。

    以及如何通过从 AddContact 触发器开始、检查方法中的逻辑以及使用输出绑定发送到 blob 的数据来完成集成测试?

    这将是一个更复杂的场景。这将需要运行 Functions 运行时并生成真实的服务总线消息以触发函数并验证 blob 是否已写入。没有随 Functions 一起提供的集成/端到端测试框架,您需要提供一些自定义的东西。 Azure Functions Core Tools 可能有助于实现这一目标。

    【讨论】:

    • 我尝试按照GitHub project 进行集成测试。它是两年前编写的,由于不再支持命名空间Microsoft.Azure.WebJobs,因此项目无法编译。我查看了您提供的链接,但没有提供集成测试示例。
    • 这是来自职能团队的 PM 的一个项目。我会尝试 ping 他,看看是否有更好的建议。
    • 真的没有什么要补充的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2021-11-19
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多