[C#] 테스트 데이터 파일을 테스트 케이스별로 디렉토리별로 관리

[C#] 테스트 데이터 파일을 테스트 케이스별로 디렉토리별로 관리



C#에서 UnitTest(MSTest)를 쓰고 있으면 테스트용 데이터 파일이 필요한 경우가 있다.
(이미지를 읽고 뭔가하거나 히어 문서로 쓰는 것은 엄격한 크기의 JSON이 있다든가)

테스트 케이스마다 필요한 파일이 다르기 때문에, "테스트 클래스/테스트 케이스"라는 이름의 디렉토리로 나누어 관리하기로 했다.
(DeploymentItemAttribute는 지금 편리함을 모른다…)

테스트 데이터는 VisualStudio에서 쉽게 표시하고 싶기 때문에 프로젝트에 등록하고 빌드시 데이터 파일로 출력 폴더에 복사하도록 설정했다.


테스트의 구현측에서는 이러한.
[TestClass]
public class SomeTestClass {

  [TestMethod]
  public void SomeTest(){
    // テストクラスやテストメソッドのリネームに追随できるよう、nameofを使ってパスを定義
    var testDataDir = Path.Combine(nameof(SomeTestClass), nameof(SomeTest)); // <- テストケースごとに書きかえる必要がある

    // ディレクトリ内のテストデータを読んでテストする
    var imgPath = Path.Combine(testDataDir, "foo.png");
  }

}

문제



nameof(SomeTestClass)를 다시 작성하는 것이 매우 번거롭습니다.

대책



이런 클래스를 만들었다.
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Diagnostics;
using System.Linq;

internal class TestHelper
{
    /// <summary>
    /// テストデータ格納ディレクトリへのパスを取得する。
    /// </summary>
    /// <returns>テストデータ格納ディレクトリへのパス。</returns>
    public static string GetTestDataDir()
    {
        var testMethodStackFrame = new StackTrace()
            .GetFrames()
            .First(x => Attribute.GetCustomAttribute(x.GetMethod(), typeof(TestMethodAttribute)) != null);
        if (testMethodStackFrame == null) throw new InvalidOperationException("This method must be called from a test method with the TestMethodAttribute attribute.");
        var testMethod = testMethodStackFrame.GetMethod();
        return $@"TestData\{testMethod.ReflectedType.Name}\{testMethod.Name}";
    }
}

이게 뭐야



이 함수를 호출하면 다음이 수행됩니다.
  • 스택 추적을 따라 TestMethod 속성이있는 메소드 (= 테스트 케이스)를 찾습니다.
  • 메서드 이름과 메서드가 정의 된 클래스 이름을 가져옵니다.
  • "TestClass\TestMethod"형식의 패스 캐릭터 라인을 생성해 돌려준다

  • 결과



    모든 테스트 케이스에서, 이하를 copipe 하는 것만으로, 대응 디렉토리를 취득할 수 있게 되었다.
    var testDataDir = TestHelper.GetTestDataDir();
    

    그 외



    테스트 프레임워크가 NUnit인 경우 TestMethodAttribute를 TestAttribute로 변경하면 그대로 움직일 것입니다.

    좋은 웹페이지 즐겨찾기