DeploymentItem 속성 문제


94

저는 현재 C # .net으로 작성된 "오래된"시스템을 유지하고 있으며, 일부 오래된 기능을 제거하고 일부 리팩토링을 수행하고 있습니다. 감사합니다, 이전 사람이 몇 가지 단위 테스트 (MSTests)를 작성했습니다. 저는 JUnit 테스트에 상당히 익숙하지만 아직 MSTests에 대해서는 많이하지 않았습니다.

테스트 메소드에는 테스트 DeploymentItem중인 비즈니스 로직 메소드에 의해 구문 분석되는 텍스트 파일을 지정 하는 속성이 있으며 두 번째 DeploymentItem는 배치해야하는 TIF 파일 묶음을 포함하는 경로 만 지정되었습니다.

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}

테스트는 이전에 작동했지만 지금은 \ files \ tif 디렉토리에 포함 된 TIF 파일의 이름을 변경해야했습니다. 규칙에 따라 TIF 파일 이름은 ExistsTifTest()메서드 에 의해 확인되는 특정 패턴과 일치해야합니다 . 이제 새로운 요구 사항에 맞게 파일 이름을 변경해야했고 갑자기 TIF 파일이 이전처럼 더 이상 배포되지 않습니다.

누군가가 왜 이런 일이 발생했는지 또는 원인이 무엇인지 힌트를 줄 수 있습니까? 테스트 메서드의 해당 DeploymentItem 속성을 사용하여 \ files \ valid \ 디렉터리의 "valid_entries.txt"옆에 "my2ndTest.txt"라는 새 텍스트 파일을 추가하는 경우에도 동일한 일이 발생합니다. 파일이 배포되지 않습니까?

testrunconfig에서 직접 배포 경로를 정의하여 이미지를 배포했지만 이러한 일이 발생하는 이유 또는 예를 들어 새 파일 "my2ndTest.txt"가 다른 파일이 배포되는 동안 배포되지 않는 이유를 이해하고 싶습니다.


2
여기서 큰 문제는 DeploymentItemAttribute에 지정된 모든 항목이 테스트 어셈블리가 실행되는 위치로 복사된다는 사실을 깨닫는 것입니다. 즉, 디렉토리 구조를 보존하기를 바랬다면 운이 좋지 않을 것입니다. 특정 디렉토리에 복사해야하는 경우 두 개의 매개 변수 DeploymentItem (source, outputDir) 버전을 사용하십시오. 참고로-System.Console.WriteLine (System.Environment.CurrentDirectory)를 테스트 중 하나에 드롭하여 MsTest에 대해 파일이 실행되는 위치를 알아 내기 위해 구식으로 갈 수 있습니다. 엔씨 런치는 이런 문제가 없었습니다!
CodeMonkeyKing 2013

답변:


112

DeploymentItem 약간 엉망입니다.

솔루션의 각 파일에는 VS.NET의 "출력 폴더로 복사"설정이 있습니다. 파일을 출력 폴더로 가져 오려면 "항상 복사"(또는 유사) 여야합니다.

새 파일에 대해이 세트가 있는지 확인하십시오. 이 설정이 없으면 파일이 출력 폴더로 복사되지 않고 출력 폴더에서 MSTest가 수행하는 폴더로 배포 할 수 없습니다.

개인적으로 단위 테스트에 필요한 파일이있는 경우 해당 파일을 어셈블리에 리소스로 포함하고 테스트 중에 어셈블리 자체를 "압축 해제"하는 것이 작업을 수행하는 더 예측 가능한 방법이라는 것을 알았습니다. YMMV.

참고 : 이 의견은 VS2010에 대한 저의 경험을 기반으로합니다. 내 대답에 대한 의견은 이것이 VS2012에 문제가 없음을 시사합니다. 나는 여전히 임베디드 리소스를 사용하는 것이 "마법"을 덜 수반하고, 내 단위 테스트의 "정렬"단계를 훨씬 더 명확하게 만든다는 의견을지지합니다.


3
출력 디렉터리로 복사는 MSTest가 파일을 배포하는 방법에 영향을주지 않습니다. 이 대답은 틀 렸습니다.
kzu

19
VS2010 Premium에서이 변경 사항 (다른 변경 사항 없음)으로 인해 파일이 배포되었습니다. 따라서 MsTest 배포에 영향을 미친다는 실제 증거를 바탕으로 결론을 내립니다.
JonStonecash 2011

1
동의합니다. 이 단일 변경으로 DeploymentItem이 거꾸로 찡그린 것을 보았습니다.
Martin Peck 2011

2
이것은 VS2012에서 더 이상 필요하지 않은 것으로 보입니다. 내 배포 항목은 "출력 폴더로 복사"가 "복사 안 함"으로 설정된 상태로 배포됩니다.
Mike

31
DeploymentItem이 제공 한 단일 파일을 복사 할 수없는 경우 알림을 제공하지 않는 것은 훌륭합니다.

74

VS2010에서 내 Local.testsettings의 "배포 활성화"가 선택되지 않았고 DeploymentItem 속성이 작동하지 않았습니다. 나는 그것을 확인했고 모든 것이 잘 작동했습니다. 이게 도움이 되길 바란다!


2
나는 그것을 작동 시키려고 오랫동안 벽돌 벽에 머리를 부딪혔다 .... 감사합니다!
mat-mcloughlin 2011

12
이 설정이 꺼져 있으면 DeploymentItem 특성이 무시된다는 경고를 프레임 워크에서 발행하면 좋았을 것이라고 생각합니다. 나는 또한 내 책상에 멋진 오목한 인상을 넣었다.
Alan McBee-MSFT

2
참고 Local.testsettings은 솔루션 항목에 있음
마태 복음 잠금

: 나는 또한 나는 또한 Local.testsettings에 배포 할 원하는 항목을 포함하는 디렉토리 추가했다 i.imgur.com/p1z3m9R.png
마태 복음 잠금

2018 년에 VS2017을 사용하여 '배포 활성화'를 확인하는 것이 여전히이 문제에 대한 해결책입니다. 그리고 슬프게도 여전히 Visual Studio에서 경고합니다. 이 솔루션에 감사드립니다.
Don H

19

나는 또한 비슷한 문제에 직면했지만 이것에 대한 쉬운 3 단계 해결책을 찾았습니다.

폴더 구조가 다음과 같다고 가정합니다. SolutionFolder\ TestProjectFolder\ SubFolder\

  1. "Solutions Items / Local.testsettings"> "배포"로 이동하여 "배포 활성화"를 선택합니다.
  2. VS2010을 사용하는 경우 배포하려는 파일의 "출력 폴더로 복사"속성이 "항상 복사"또는 "최신 인 경우 복사"로 설정되어 있는지 확인하십시오.
  3. 다음 중 하나를 사용하여 TestMethod를 지정합니다.
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]모든 컨텐츠를 <SubFolder>Test Run 디렉토리 에 배포
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")] 의 모든 콘텐츠를 배포하는 방법 <SubFolder><TargetFolder>테스트 실행 디렉토리에

MSTest에 대한 마지막 참고 사항 (적어도 VS2010의 경우) :

당신이 원하는 경우는 <TargetFolder>와 같은 이름을 가지고 <SubFolder>사용 [DeploymentItem(@"SubFolder", @"SubFolder")]MSTEST 주자 바보 가장자리 케이스 안타 자동으로 실패합니다. 당신이 접두사를해야하는 이유입니다 <SubFolder><TestProjectFolder>않도록 :[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]


SubFolder 이름 지정 실패에 대한 메모는 보석입니다.
RJ Lohan 2014 년

1
VS 2015는 조금 다른 것 같습니다. DeploymentItem 속성에서 "TestPojectFolder"부분을 제거해야했습니다.
uli78

15

다른 사람을 돕기 위해 : 여기에서 모든 제안을 시도했지만 여전히 배포 항목이 복사되지 않았습니다.

내가해야 할 일은 ( 여기에 제안 된대로 ) DeploymentItem 속성에 두 번째 매개 변수를 추가하는 것입니다.

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]

10

.testrunconfig 파일로 이동하여 배포에서 "배포 활성화"를 선택 취소하면 테스트가 정상적인 위치에서 실행되고 모든 것이 단위 테스트 외부에서 앱을 실행할 때처럼 작동합니다.


이것에도 몇 가지 문제가있었습니다. PM으로서 저는 개발자가 사용하는 모든 도구에 액세스 할 수 없습니다. 이 경우 ReSharper가 파일을 올바르게 복사했지만 MSTest는이를 수행하지 못했습니다. -> 개발자가 정상인 동안 오류가 발생했습니다. 문제의 파일을 포함하여 '테스트-> 테스트 설정 편집-> 로컬 설정-> 배포'로 변경하여 MSTest 사용을 위해이 문제를 해결했습니다.
sonstabo 2011-06-22

9

이것은 아마도 정확한 문제와 관련이 없지만 [DeploymentItem] 속성으로 찾은 몇 가지 팁입니다.

  1. 출력 디렉토리에 복사는 항상 복사로 설정되어야합니다.

[TestInitialize] 속성과 함께 사용하면 작동 하지 않습니다.

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

[TestMethod]에 있어야합니다. 예 :

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }

1
이것은 엄청나게 성가신 제한입니다. 많은 경우에 배포 할 시간이 Initialize에 있어야한다고 생각합니다. 모든 테스트가 동일한 지원 아티팩트를 사용하면 어떻게됩니까? 수십 가지 테스트 방법에서 데코레이터를 복사하여 붙여 넣어야한다고 생각합니까? 어리석은.
Ryanman

5

여기에 나열된 다른 제안을 모두 시도한 후에도 여전히 무슨 일이 일어나고 있는지 파악할 수 없었습니다. 마지막으로 테스트 / 테스트 설정 메뉴에서 선택된 설정 파일이 없다는 것을 발견했습니다. 이는 배포가 활성화되지 않았 음을 의미합니다. 테스트 / 테스트 설정 / 테스트 설정 파일 선택 메뉴 항목을 클릭하고 Local.TestSettings 파일을 선택한 다음 모든 것이 작동했습니다.


4

이것이 질문에 정확히 대답하는지 확실하지 않지만 일부는 도움이 될 수 있습니다. 먼저 배포가 작동하려면 "배포 활성화"확인란을 선택해야합니다. 둘째, 문서는 소스 경로가 "프로젝트 경로에 상대적"이라고 말하며 처음에는 프로젝트 폴더를 의미합니다. 실제로 빌드 출력 폴더를 참조하는 것 같습니다. 따라서 'TestFiles'라는 프로젝트 폴더가 있고 그 안에라는 파일이 있으면 Testdata.xml이 속성을 사용하면 작동하지 않습니다.

[DeploymentItem(@"TestFiles\Testdata.xml")] 

빌드가 출력 폴더 (예 :) 아래에 복사본을 넣도록 Testdata.xml파일을 표시 할 수 있습니다 . 그런 다음 배포 메커니즘은 빌드 출력과 관련된 해당 경로 ( ) 에있는 파일의 복사본을 찾습니다 . 또는 다음과 같이 속성을 설정할 수 있습니다.Copy AlwaysDebug\TestFiles\TestData.xmlTestFiles\Testdata.xml

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

배포 메커니즘이 원본 파일을 찾습니다. 둘 다 작동하지만 Copy Always프로젝트에서 app.config 파일을 편집 할 때 발생하는 동일한 문제가 가끔씩 발생 한다는 것을 알았 습니다. 빌드시 복사됩니다.


상대 경로가 저에게 문제 였고 이로 인해 해결되었습니다. 테스트 실행 방법에 따라 두 세트의 DeploymentItem 문을 추가했습니다.
Ed Bayiates 2016 년

3

먼저 배포 플래그를 비활성화했습니다. 하지만 활성화 한 후에도 알 수없는 이유로 대상 DLL조차도 복사되지 않습니다. 우연히 테스트 실행 창을 열고 이전 실행을 모두 종료했고 마술처럼 다음 실행시 테스트 폴더에서 필요한 모든 DLL과 파일을 찾았습니다. 매우 혼란 스럽습니다.


2

위의 모든 제안을 시도하여 배포 할 파일을 가져 오는 데 큰 문제가있었습니다.

그런 다음 VS2010을 닫았습니다. 다시 시작하고 솔루션을로드했으며 모든 것이 작동했습니다. (!)

몇 가지 확인을했습니다. local.TestSetting에서 '배포 활성화'플래그를 설정 한 후에는 테스트 결과 창에서 테스트를 다시 실행하면 안됩니다. 다른 테스트를 실행하거나 솔루션을 다시 열어 UI에서 이전 테스트 실행을 제거해야합니다.


2

사용하지 마십시오 DeploymentItem.

올바르게 설정하기가 매우 어려우며 내 ReSharper 테스트 실행기 나 Visual Studio 2017의 MSTEST 용 기본 실행기와 함께 작동하지 않았습니다.

대신 데이터 파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하십시오 . 출력 디렉터리에 복사 : 항상을 선택합니다 .

이제 테스트에서 이렇게하십시오. 디렉토리는 단순히 테스트 프로젝트와 관련된 파일의 디렉토리입니다. 쉬운.

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

이것은 자동화 된 빌드 및 테스트 시스템에서 잘 작동하는 것 같습니다.


1

항상 DeploymentItem 특성이 엉망인 것을 발견했기 때문에 빌드 후 스크립트를 사용하여 이러한 파일을 배포합니다. -복사하려는 파일에 항상 복사 속성이 설정되어 있는지 확인하십시오. -테스트 프로젝트 빌드 후 스크립트를 수정하여 빌드 대상 폴더 (Bin \ Debug)에서 테스트가 예상하는 위치로 파일을 복사합니다.


1

VS2010을 위해 이것을 시도하십시오. 따라서 모든 tif에 대해 DeployItems를 추가 할 필요가 없습니다
.

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

테스트 구성을 추가하십시오.
-솔루션 탐색기에서 솔루션 노드를 마우스 오른쪽 버튼으로 클릭
-추가-> 새 항목 ...-
왼쪽에서 테스트 설정 노드 선택, 오른쪽에서 항목 선택
-추가 클릭

예를 들어 TDD

선택 TDD아래 TestMenu> Edit Testsettings.

배포를 클릭합니다. 활성화 한 다음 원하는 파일과 디렉터리를 추가합니다. 솔루션에 대한 상대 경로가 있습니다. 파일이 배치됩니다. 원본 파일은 예를 들어 다음과 같습니다.

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

내 단위 테스트를 실행하면 복사됩니다.

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

테스트 코드에서 다음에서 호출합니다.

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

항상 복사를 선택할 필요가 없습니다. 파일을 testproject에 넣으십시오. 테스트 코드에 하드 코딩 된 경로를 추가하십시오. 저에게는이 솔루션이 가장 잘 작동했습니다. DeploymentItem으로 시도했지만 항상 복사했지만 내 마음에 들지 않았습니다.


1

DeploymentItem의 혼란을 피하고 @Martin Peck이 제안한 접근 방식을 선호하는 사람들은 다음 코드를 사용하여 포함 된 리소스의 내용에 액세스 할 수 있습니다.

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

자세한 내용은 이 SO 스레드를 참조하십시오.


1
빌드 서버에서 실행할 때 Assembly.GetExecutingAssembly ()에 문제가 있습니다-> 실제 테스트 어셈블리 대신 테스트 러너를 반환합니다. testassembly (예 : testclass)에서 고정 된 유형을 반영하여 어셈블리를 가져 오면이 문제가 해결되었습니다.
Arno Peters 19 년

1

저에게 근본 원인은 완전히 다른 것입니다. 테스트에서 실행중인 프로덕션 코드는 배포중인 .xml 테스트 파일의 이름을 바꾸거나 삭제하는 것입니다.

따라서 테스트를 개별적으로 실행하면 통과되지만 모두 함께 실행하면 "파일을 찾을 수 없음"오류와 함께 두 번째 및 후속 테스트가 실패합니다. DeploymentItem 속성이 작동하지 않는 .

내 솔루션은 각 개별 테스트 방법이 배포 된 파일의 복사본을 만든 다음 ( 이 기술 사용 ) 테스트중인 프로덕션 코드가 원본 대신 복사 된 파일을 사용 하도록하는 것이 었습니다 .


1

우리는 로컬 단위 테스트 실행과 팀 시티 단위 테스트 재결합에서도 문제를 해결하기 위해 배포 항목 문제로 많은 시간을 보냈습니다. 쉽지 않다.

이 문제를 디버깅하는 아주 좋은 도구는 ProcessExplorer 입니다. 프로세스 탐색기를 사용하여 Visual Studio가 배포 항목을 검색하는 위치를 확인하고 프로젝트를 수정할 수 있습니다. path에 배포 항목 파일 이름이 포함 된 모든 파일 작업을 필터링하면 볼 수 있습니다.


나는 이것이 매우 오래된 대답이라는 것을 알고 있지만 ProcessExplorer를 사용하는 방법에 대해 자세히 설명 할 수 있다면 도움이 될 것입니다. 파일 작업을 보는 방법이 전혀 보이지 않고 필터링이 훨씬 적습니다.
David

1

확인해야 할 Deployment 속성 외에도 DeploymentItem 속성에 대해 다른 것을 발견했습니다.

[TestMethod()]
[DeploymentItem("folder\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

deploymentFile.txt는 testfile.cs가 아니라 솔루션 파일에 상대적이어야합니다.

여기에 이미지 설명 입력


마침내 내 DeploymentItem 소스가 테스트 프로젝트와 관련되도록하여이 작업을 수행했습니다. 그래서 내 솔루션에 "Service.Tests"라는 프로젝트가 있습니다. 그 아래에 복사하려는 파일이있는 "FilesForTests"폴더가 있습니다. 나는 [DeploymentItem(@"FilesForTests\MyFile.txt", "FilesForTests")]. 내가 생각하는 우리는 똑같은 말을하는거야?
David

1

저는 VS2013에서이 작업을 해왔습니다. 이 작업을 수행하기위한 내 결과 :

  • 출력 디렉토리에 복사는 최신 인 경우 복사 / 항상 복사 : 필수로 설정해야합니다.
  • .TestSettings의 "배포 활성화": 필요하지 않습니다. .TestSettings 파일 없이도 작동합니다.
  • 두 번째 매개 변수로 폴더 지정 : OPTIONAL. 출력 폴더 레이아웃을 형성하고 없이도 잘 작동합니다.
  • 파일 이름의 공백 : 이로 인해 두통이 생겼습니다. 파일이 복사되지 않았습니다. 공간을 제거하면이 문제가 해결되었습니다. 아직 이스케이프 문자를 조사하지 않았습니다.

또한 어려운 방법을 배웠습니다.이 속성을 각 개별 테스트에 추가하는 것을 잊지 마십시오. 파일은 테스트 실행의 첫 번째 속성 테스트에서 복사되지만 테스트 순서가 변경되고 속성이없는 테스트가 파일을 먼저 찾으려고하면 누락 된 상태로 남아 있습니다.


가장 마지막 답변에 도달하기 전에 여기에서 모든 것을 시도했습니다. 범인 : 파일 이름의 공백! 좋은 설명입니다.
joelmdev

1
Visual Studio 2019 사용. "최신 버전 인 경우 복사"가 수정되었습니다. 디버그 또는 증분 빌드와 같은 많은 시나리오에서 프로젝트를 다시 빌드해야하기 때문에 "항상 복사"가 싫습니다.
Gerardo Grignoli

동의합니다. 새 경우 복사를 포함하도록 내 답변을 업데이트했습니다.
Arno Peters

0

내 큰 "잡았다"는 것은 DeploymentItem이 디렉토리를 처리하는 방식이었습니다. 배포하려는 하위 디렉터리가 포함 된 디렉터리 경로로 두 매개 변수 버전을 모두 사용했습니다. 처음에는 전체 재귀 폴더 구조가 아니라 디렉터리의 ROOT에있는 항목 만 복사한다는 사실을 몰랐습니다!

기본적으로 [DeploymentItem (@ "Foo \", @ "Foo \")]이 있었고 내 Foo \ Bar를 배포 할 것으로 예상했습니다. 구체적으로 [DeploymentItem (@ "Foo \ Bar \", @ "Foo \ Bar \")]로 변경해야했고 이제는 매력처럼 작동합니다.


0

나는 또한 비슷한 문제에 직면했습니다. 위에서 언급 한 모든 단계가 있지만 여전히 운이 없습니다. VS2010을 사용하고 있습니다. 그런 다음 $ 메뉴> 테스트> 활성 테스트 설정 선택> 추적 및 테스트 영향 이 선택되었습니다. 추적 및 테스트 영향을 Local로 변경 한 후 작동하기 시작했습니다 . 이 페이지에는 테스트 결과 폴더에 파일을 복사하는 방법에 대한 매우 유용한 정보가 포함되어 있습니다.이 경험도 추가하고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.