【问题标题】:Docker compose .Net Core NUnit Test and RedisDocker 编写 .Net Core NUnit 测试和 Redis
【发布时间】:2020-03-02 02:52:45
【问题描述】:

我有一个包含 API 和 NUnit 测试的 .Net Core 解决方案。当我运行docker-compose up 时,如果我不包含测试,API 可以正常工作。但是,如果我实施测试,则 docker compose 无法构建,并出现错误 StackExchange.Redis.RedisConnectionException : It was not possible to connect to the redis server(s). UnableToConnect on redis-service:6379/Interactive 在命令行中。

我的Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["ReportApi/ReportApi.csproj", "ReportApi/"]
COPY ["ReportApi.Test/ReportApi.Test.csproj", "ReportApi.Test/"]RUN dotnet restore "ReportApi/ReportApi.csproj"
RUN dotnet restore "ReportApi.Test/ReportApi.Test.csproj"
COPY . .
WORKDIR "/src/ReportApi"
RUN dotnet build "ReportApi.csproj" -c Release -o /app/build
WORKDIR "/src/ReportApi.Test"
RUN dotnet build "ReportApi.Test.csproj" -c Release -o /app/build


FROM build AS publish
WORKDIR "/src/ReportApi"
RUN dotnet publish "ReportApi.csproj" -c Release -o /app/publish
WORKDIR "/src/ReportApi.Test"
RUN dotnet test "ReportApi.Test.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ReportApi.dll"]

我的docker-compose.yml

version: "3.7"
services: 
    redis-service:
        container_name: redis
        image: redis
        ports:
            - "6379:6379"
        restart: always

    report-api:
        build: 
            context: .
            dockerfile: Dockerfile
        ports: 
            - "10001:80"
        depends_on: 
            - "redis-service"

我的测试课:

namespace ReportApi.Test
{
    class RedisCacheControllerTest
    {
        public IDatabase Cache { get; set; }
        public RedisCacheController Controller { get; set; }

        [SetUp]
        public void Init()
        {

            // Set up Redis Cache
            var redis = ConnectionMultiplexer.Connect("redis-service:6379");

            var services = new ServiceCollection();
            services.AddScoped(s => redis.GetDatabase());
            var provider = services.BuildServiceProvider();
            Cache = provider.GetService<IDatabase>();

            // Create controller instance
            Controller = new RedisCacheController(Cache);

        }

        [Test]
        public void InsertRecordTest()
        {
            // Create a new instance of RedisCache
            RedisCache redisCache = new RedisCache()
            {
                id = "testId",
                value = "CacheData"
            };

            // If the redisCache object doesn't exist, check if it returns 200 OK;
            // otherwise check if it returns 409 Conflict
            if (Cache.StringGet(redisCache.id).Length() == 0)
            {
                Assert.IsInstanceOf<OkObjectResult>(Controller.Create(redisCache));
            }
            else
            {
                Assert.IsInstanceOf<ConflictObjectResult>(Controller.Create(redisCache));
            }
        }

        [Test]
        public void RetrieveRecordTest()
        {
            string key = "testId";
            // If the record exists, check if it returns 200 OK;
            // otherwise check if it returns 204 No Content
            if (Cache.StringGet(key).Length() != 0)
            {
                Assert.IsInstanceOf<OkObjectResult>(Controller.Get(key));
            }
            else
            {
                Assert.IsInstanceOf<NoContentResult>(Controller.Get(key));
            }
        }
    }
}

【问题讨论】:

    标签: .net docker asp.net-core redis docker-compose


    【解决方案1】:

    Redis 是在 docker-compose.yml 中定义的,只有在每个服务(在其中定义)都已经构建后才会运行。

    因此,在构建 Dockerfile 时,还没有从 docker-compose 运行任何内容。

    互联网上人们在这种情况下推荐不同的方法,例如:https://medium.com/@christiansparre/integration-testing-with-docker-compose-and-visual-studio-team-service-83a1166055a8

    但是,无论如何,我建议您不要在构建 Dockerfile 时运行测试。相反,从您的 docker-compose.yml 运行它们(上面的链接)。

    您当前使用的方法的目标是确保容器的映像在创建时已经过测试。但是,你没有从中获得积分。如果您的测试在镜像已经构建后失败,只需删除它并且不要使用它,如果它不起作用,没有人要求您运行保留容器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2021-07-17
      • 2021-12-03
      相关资源
      最近更新 更多