【问题标题】:How to do Functional Testing for Azure Functions?如何对 Azure Functions 进行功能测试?
【发布时间】:2020-08-22 02:10:46
【问题描述】:

我想知道是否有人知道如何对实现 Azure Functions 的类执行功能测试。

首先,nice article 介绍了如何为 Visual Studio (2019) Azure Functions 项目模板生成的函数类设置测试。问题是我的 Azure Functions 实现使用依赖注入,不能使用像在新 Azure Functions 项目中生成的静态类。我的实现使用了一个 Startup 类,它类似于您在 this article 中找到的关于带有依赖注入的 Azure Functions 的内容。

我已经包含了一个返回系统版本的简单函数方法。 Startup 和函数类如下所示:

[assembly: FunctionsStartup(typeof(SomeNamespace.FunctionApp.Startup))]
namespace SomeNamespace.FunctionApp
{
    public sealed class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSomeService(); // IServiceCollection extension method defined elsewhere.
        }
    }

    public class SomeFunctions
    {
        public SomeFunctions(IConfiguration configuration, ISomeService someService)
        {
            _someService = someService;

            Version currVersion = GetType().Assembly.GetName().Version;
            _systemVersion = new Version(currVersion.Major, currVersion.Minor, configuration.GetValue<Int32>("BuildId")).ToString();
        }

        private readonly ISomeService _someService;
        private readonly String _systemVersion;

        [FunctionName("SystemVersion")]
        public ActionResult<String> SystemVersion([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "SomeFunctions/SystemVersion")] HttpRequest req)
        {
            return new JsonResult(_systemVersion) { StatusCode = (Int32)HttpStatusCode.OK };
        }
    }
}

作为参考,这是实现控制器类的 Web API 项目的功能测试类的样子。请注意,下面列出的Startup 类与用于SomeFunctions 类的Startup 类相似但不同。

namespace SomeNamespace.WebAPI.Controllers
{
    public sealed class TestSomeController : IClassFixture<WebApplicationFactory<Startup>>
    {
        public TestSomeController(WebApplicationFactory<Startup> factory)
        {
            _client = factory.CreateClient();
        }

        private readonly HttpClient _client;

        [Fact]
        public async Task Get()
        {
            var httpResponse = await _client.GetAsync("api/SomeRoute");
            Assert.Equal(HttpStatusCode.OK, httpResponse.StatusCode);
        }
    }
}

我正在尝试为上面的SomeFunctions 类做类似的事情。如果我执行类似于上述 Web API 项目的实现,我会收到以下错误消息:

System.InvalidOperationException: '提供的类型'Startup'不属于具有入口点的程序集。这个错误的一个常见原因是从类库中提供了一个类型。'

如何在上面的SomeFunctions 实现中为 Azure Functions 实现功能测试类?

【问题讨论】:

  • 只需在您的测试中实例化函数类。 var functions = new SomeFunctions(configMock, someServiceMock); 并调用函数var result = functions.SystemVersion(request);
  • 我希望功能测试是使用真实服务和运行一些真实测试用例的系统全栈测试。这就是我使用常规 Web API 所做的事情。再说一次,如果我不能让它工作,我可能会按照你的描述做,直接创建函数类的实例并使用模拟服务调用它。

标签: .net-core dependency-injection azure-functions xunit functional-testing


【解决方案1】:

我找到了great article,了解如何使用 Azure Functions 执行集成测试。这个测试实现并不是一个将 HTTP 请求发送到 URL 的完整功能测试,但它足以测试从 Azure Function 方法实现范围向内的完整应用程序堆栈。

测试类的要点如下:

namespace SomeNamespace.FunctionApp
{
    public sealed class TestSomeFunctions
    {
        public TestSomeFunctions()
        {
            var startup = new Startup();
            var host = new HostBuilder()
                .ConfigureWebJobs(startup.Configure)
                .Build();

            _someFunctions = new SomeFunctions(SomeFunctions);
        }

        private readonly SomeFunctions _someFunctions;

        [Fact]
        public void SystemVersion()
        {
            var request = new DefaultHttpRequest(new DefaultHttpContext());
            JsonResult jsonResult = _someFunctions.SystemVersion(request).Result as JsonResult;
            Assert.Equal((Int32)HttpStatusCode.OK, jsonResult.StatusCode);
        }
    }
}

【讨论】:

  • 测试队列绑定等怎么样?你试过吗?
猜你喜欢
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多