[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}";
}
}
이게 뭐야
이 함수를 호출하면 다음이 수행됩니다.
[TestClass]
public class SomeTestClass {
[TestMethod]
public void SomeTest(){
// テストクラスやテストメソッドのリネームに追随できるよう、nameofを使ってパスを定義
var testDataDir = Path.Combine(nameof(SomeTestClass), nameof(SomeTest)); // <- テストケースごとに書きかえる必要がある
// ディレクトリ内のテストデータを読んでテストする
var imgPath = Path.Combine(testDataDir, "foo.png");
}
}
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}";
}
}
결과
모든 테스트 케이스에서, 이하를 copipe 하는 것만으로, 대응 디렉토리를 취득할 수 있게 되었다.
var testDataDir = TestHelper.GetTestDataDir();
그 외
테스트 프레임워크가 NUnit인 경우 TestMethodAttribute를 TestAttribute로 변경하면 그대로 움직일 것입니다.
Reference
이 문제에 관하여([C#] 테스트 데이터 파일을 테스트 케이스별로 디렉토리별로 관리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hogegex/items/c7c3c779426a32158ed8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)