일부 테스트에는 런타임에 테스트 데이터, 구성 파일, 골든 마스터 또는 네이티브 종속성 등의 추가 파일이 필요합니다. 각 테스트가 실행될 때 테스트 어셈블리 옆에서 사용할 수 있어야 하는 파일 및 폴더를 선언하려면 DeploymentItemAttribute를 사용합니다.
개요
테스트 클래스 또는 테스트 메서드에 적용 [DeploymentItem] 하면 MSTest는 지정된 파일 또는 폴더를 해당 범위의 테스트가 실행되기 전에 노출되는 TestContext.DeploymentDirectory 디렉터리에 복사합니다. 배포 디렉터리도 테스트의 현재 작업 디렉터리이므로 테스트 코드에서 복사한 이름으로 파일을 열 수 있습니다.
특성은 상대 경로 또는 절대 경로를 허용합니다.
-
상대 경로는 빌드 출력 디렉터리(예를 들어
bin\Debug\net10.0\가 있는 폴더)를 기준으로 확인됩니다. - 절대 경로는 있는 그대로 사용됩니다.
Important
MSTest 3.x에서 배포 항목은 테스트 실행당 복사됩니다. 배포 시 파일을 사용할 수 있도록 하려면 파일이 빌드 출력 디렉터리에 이미 있거나 복사되어야 합니다.
적용하다 [DeploymentItem]
특성은 테스트 메서드, 테스트 클래스 또는 둘 다에 적용할 수 있습니다. 여러 인스턴스가 허용되고 결합됩니다.
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
[DeploymentItem(@"TestFiles\shared-config.json")]
public class ConfigurationTests
{
[TestMethod]
[DeploymentItem(@"TestFiles\customers.csv")]
public void LoadCustomers_FromCsv_ReturnsAllRows()
{
// Both shared-config.json (from the class) and customers.csv (from
// the method) are available in the deployment directory.
Assert.IsTrue(File.Exists("shared-config.json"));
Assert.IsTrue(File.Exists("customers.csv"));
}
}
메모
테스트 클래스에 적용 [DeploymentItem] 하는 경우 클래스에는 하나 이상의 테스트 메서드가 포함되어야 합니다.
AssemblyInitialize 메서드만 있거나 ClassInitialize 메서드만 있는 클래스에 이를 적용해도 아무 효과가 없습니다. 분석기 MSTEST0035는 이러한 오용을 보고합니다.
생성자 오버로드
DeploymentItemAttribute 에는 두 개의 생성자가 DeploymentItemAttribute(string path) 있습니다 DeploymentItemAttribute(string path, string outputDirectory).
DeploymentItemAttribute(string path)
식별된 파일 또는 폴더 path 를 배포 디렉터리의 루트에 복사합니다.
// Copy a single file from the build output directory.
[DeploymentItem("settings.json")]
// Copy a file that lives in a subfolder of the build output directory.
// The file is copied to the root of the deployment directory (the
// "Resources" folder is not preserved).
[DeploymentItem(@"Resources\test-data.xml")]
// Copy the entire TestFiles folder (and all of its subfolders) into the
// deployment directory.
[DeploymentItem("TestFiles")]
DeploymentItemAttribute(string path, string outputDirectory)
outputDirectory로 지정된 배포 디렉터리의 하위 디렉터리에 항목을 복사합니다.
// Creates a "Data" subfolder under the deployment directory, then copies
// test-data.xml into it. The file is reached at "Data\test-data.xml".
[DeploymentItem("test-data.xml", "Data")]
// Copies the contents of the Resources folder into a "Resources"
// subfolder of the deployment directory.
[DeploymentItem("Resources", "Resources")]
인수는 outputDirectory 폴더 경로여야 합니다. 파일 이름을 바꾸는 데 사용할 수 없습니다. 다른 이름을 가진 파일을 배포하려면 원본 폴더에서 이름을 바꾸거나 빌드 후 단계를 사용합니다.
원본 파일이 빌드 출력 디렉터리에 도달하는지 확인
상대 경로는 빌드 출력 디렉터리에 대해 확인되므로 원본 파일 또는 폴더가 이미 있어야 합니다. 이를 달성하는 두 가지 일반적인 방법이 있습니다.
CopyToOutputDirectory와 함께 <None> 또는 <Content>을 사용
테스트 프로젝트에 파일을 추가하고 빌드 출력 디렉터리에 복사하도록 표시합니다.
<ItemGroup>
<None Update="TestFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
빌드 후 TestFiles 폴더가 bin\<Configuration>\<TargetFramework>\TestFiles\에 복제되고 [DeploymentItem("TestFiles")]가 올바르게 해석됩니다.
빌드 후 대상 사용하기
테스트 프로젝트 외부에 있는 파일의 경우 빌드의 일부로 빌드 출력 디렉터리에 복사합니다.
<Target Name="CopySharedAssets" AfterTargets="Build">
<Copy SourceFiles="@(SharedAsset)"
DestinationFolder="$(OutDir)SharedAssets\" />
</Target>
런타임에 배포 디렉터리 검사
배포 디렉터리의 절대 경로가 필요한 경우(예: 생성한 프로세스에 전달하거나 진단용으로 기록하려면) 다음을 사용합니다 TestContext.DeploymentDirectory.
using System.IO;
[TestMethod]
[DeploymentItem(@"TestFiles\input.json")]
public void ProcessInput_FromDeployedFile_Succeeds()
{
string fullPath = Path.Combine(TestContext.DeploymentDirectory, "input.json");
string contents = File.ReadAllText(fullPath);
// ...
}
배포가 발생하지 않는 경우
기본적으로 MSTest는 실행당 배포 디렉터리를 만들고 항목을 복사합니다.
.runsettings 파일에서 배포를 비활성화하여 테스트가 빌드 출력 디렉터리에서 직접 실행되도록 할 수 있습니다.
<RunSettings>
<MSTest>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>
배포를 사용하지 않도록 설정 [DeploymentItem] 하면 특성이 적용되지 않으며 테스트는 빌드 출력 디렉터리 자체에서 실행됩니다. 자세한 구성 옵션은 MSTest 구성을 참조하세요.
레거시 모드 및 .testsettings
MSTest가 레거시 모드로 실행될 때(.testsettings 파일이 사용되거나 .runsettings 파일에서 RunSettings/MSTest/ForcedLegacyMode이 true(으)로 설정된 경우), 상대 경로는 빌드 출력 디렉터리 대신 솔루션 루트 디렉터리를 기준으로 해결될 수 있습니다. 새 프로젝트에 대한 레거시 모드를 사용하지 않도록 합니다. 최신 .runsettings기반 구성이 권장되는 방법입니다.
모범 사례
- 깊은 상대 경로보다
CopyToOutputDirectory를 사용하는 것이 좋습니다...\..\스타일 경로로 소스 폴더를 직접 참조하지 마세요. 그러면 테스트가 특정 리포지토리 구조에 종속됩니다. 먼저 빌드 출력 디렉터리에서 파일을 스테이징합니다. - 배포 항목을 작게 유지합니다. 각 항목은 모든 테스트 실행에 대해 복사됩니다. 큰 파일은 테스트 실행 속도가 느려집니다.
- 폴더를 사용하여 관련 자산을 함께 배포합니다.
[DeploymentItem("TestFiles")]는 파일당 수십 개의 특성보다 유지 관리가 더 쉽습니다. - 작은 설비의 경우 포함된 리소스 또는 메모리 내 데이터를 선호합니다. 포함된 리소스는 배포할 필요가 없으며 테스트 시 I/O를 방지합니다.
- 프로젝트 디렉터리인 작업 디렉터리에 의존하지 마세요. 테스트 실행 중에 작업 디렉터리가 테스트 프로젝트 폴더가 아닌 배포 디렉터리입니다.
참고하십시오
.NET