ASP.NET Core, EF Core, PostgreSQLのテストをGitLab CIで回す

以前別のブログに書いた記事のため
フレームワークバージョンが古いことにご注意ください

EF Coreを利用したCIをGitLabで回そうとした際にRDBコンテナとの接続のやり方が分からず嵌りましたが、とりあえずできたので書き残しておきます。より適切なやり方があるかもしれません。 私の環境で、フレームワーク等は以下のバージョンを使いました。

やりたいこと

やること

  1. ASP.NET Coreプロジェクトを作成
  2. EF Coreモデルを作成
  3. テストを作成
  4. GitLab CIの設定ファイルを作成

1. ASP.NET Coreプロジェクトを作成

プロジェクト名・ソリューション名はSampleApiとします。 WebApiとしてプロジェクトを作成しますが、本記事の範囲では何でも構いません。 さらにテストプロジェクトSampleTestを追加します。

mkdir SampleApi
cd SampleApi
dotnet new sln
dotnet new webapi -o SampleApi
dotnet new xunit -o SampleTest
dotnet sln add SampleApi SampleTest

作成できるプロジェクトはインストールされたSDKバージョンに依存します。

2. EF Coreのモデルを作成

適当なモデルをSampleApiプロジェクトに追加します。

public class User
{
  [Key]
  public long Id { get; set; }

  public string Name { get; set; }
}

上のモデルを含むDbContextを作成します。 接続文字列を環境変数から拾うようにしています。

public class SampleDbContext : DbContext
{
  public DbSet<User> Users { get; set; }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    var connectionString = Environment.GetEnvironmentVariable("DB_CONNECTION_STRING");
    optionsBuilder.UseNpgsql(connectionString);
  }
}

NugetでNpgsql.EntityFramework.Coreを取得する必要があります。

3.テストの作成

テストプロジェクトにテストを追加します。 今回はEF Coreを使いデータを突っ込んで取り出すだけのテストです。

public class UnitTest1
{
  [Fact]
  public void Test1()
  {
    //arrange
    var sut = new SampleDbContext();
    var id = 1;
    var user = new User() {Id = id, Name = "Alice"};

    //act
    sut.Users.Add(user);
    sut.SaveChanges();
    var result = sut.Users.First(u => u.Id == id);

    //assertion
    Assert.Equal(user.Id, result.Id);
    Assert.Equal(user.Name, result.Name);
  }
}

4. GitLab CIの設定ファイルを作成

GitLab CIを動かすために .gitlab-ci.yml を追加します。 PostgreSQLコンテナの設定はGitLab公式のUsing PostgreSQLを参考にしました。 DB_CONNECTION_STRINGは上のSampleDbContextで使う環境変数で、PostgreSQLコンテナの設定に合わせます。

stages:
- test

test:
  stage: test
  image: microsoft/dotnet:2.2-sdk
  services:
  - postgres:11.1
  variables:
    POSTGRES_DB: nice_marmot
    POSTGRES_USER: runner
    POSTGRES_PASSWORD: "admin1234"
    DB_CONNECTION_STRING: "Host=postgres;Username=runner;Password=admin1234"
  script:
  - cd SampleApi
  - dotnet restore
  - cd SampleApi
  - dotnet ef migrations add InitialCreate
  - dotnet ef database update
  - cd ..
  - dotnet test

以上をpushするとパイプラインが走り、マイグレーション、テストまで動いてくれました。

Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.