2010-03-31 4 views
4

DUnit 프레임 워크를 사용하는 응용 프로그램에 대한 단위 테스트 프로젝트가 있습니다. 이 프로젝트의 단위는 $IFDEF으로 둘러싸여 GUI 또는 명령 줄 대신 xml 파일에 테스트 결과를 출력합니다. XML_OUTPUT 정의는 빌드 구성을 전환하여 사용할 수 있습니다.새 장치를 가지고 있는데 '유니트 사용'이 사라지는 이유는 무엇입니까?

program DelphiCodeToDoc_Tests; 

uses 
    TestFramework, 
    TextTestRunner, 
    Sysutils, 
    Forms, 
    GUITestRunner, 
{$IFDEF XML_OUTPUT} 
    XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas', 
{$ENDIF} 
    DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas', 
    ... 

이것은 완벽하게 작동합니다. IDE에서이 프로젝트 ('File> New> Unit'이있는 새 장치)에 새 장치를 추가하면 문제가 으로 시작됩니다.

테스트 프로젝트

는 지금 : 보시다시피

uses 
    TestFramework, 
    TextTestRunner, 
    Sysutils, 
    Forms, 
    GUITestRunner, 
    DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas', 
    ... 
    MyNewUnit in 'IntegrationTests\MyNewUnit.pas'; 

, 시험을 xml_output가 사라졌다 ... 난 유닛을 추가 해요 때마다, 델파이 IDE는이 테스트를 삭제합니다.

왜, 어떻게 피할 수 있는지 알고 계십니까?

답변

5

어쨌든 실제로 사용되는 코드 만 응용 프로그램에 컴파일되므로 보통 사용되지 않는 Uses 절의 단위는 아프지 않습니다.

당신은 당신의 IDE 내에서 프로그램을 실행할 때 응용 프로그램에 연결된 모든 코드를 볼 수 있습니다. 컴파일 된 코드 옆에는 파란색 점이 표시됩니다.

하나주의해야 할 점은 당신이 관심있는 단위의 initialization 섹션을 확인해야한다는 것입니다. 초기화 섹션에있는 코드는 응용 프로그램이 시작 되 자마자 해당 섹션의 코드가 실행되기 때문에 유닛을 포함하면 자동으로 포함됩니다. 필요한 경우 초기화 코드가 링크되어 실행되지 않도록하기 위해 유닛의 초기화 섹션에 컴파일러 지시문을 추가 할 수 있습니다.

+0

'XmlTestRunner2'는 단위 테스트 파일과 달리 초기화 코드를 가지고 있지 않으므로이 리스너를 uses 목록에 추가 할 수있다. 빌드 구성에 따라 나중에 호출 된 경우에만 링크됩니다. ** Marcus, 그래서 내 문제를 해결했습니다! ** 다른 상황에서는'gabr'의'proxy unit' 메소드를 적용 할 것입니다. – TridenT

5

민주주의 인민 공화국의 목록은 IDE에 의해 관리되고 사용합니다. 불행히도이 문제에 관해 할 수있는 일은 없습니다. 공식적으로 DPR 의 중간에 IFDEF를 넣지 않아도된다면, 목록을 사용하십시오. 이렇게하면 이런 일이 일어나기 때문입니다.

내가 할 수있는 것은 프로젝트에 XmlTestRunner2 유닛을두고 프로젝트 자체에 IFDEF를 넣어 XML_OUTPUT이 설정되어 있지 않으면 아무것도 컴파일하지 않도록하는 것입니다.

+0

IFDEF를 내부에 추가하여 장치를 변경하고 싶지 않습니다. 그것을 제 3 자 유닛으로 보아라. 당신의 생각은 멋지지만, 나는 그것을 좋아하지 않는다. : – TridenT

7

당신은 (우리의 많은 버그가 아닌 기능을 고려)이 문제 행동을 우회하는 메인 프로그램에 프록시 유닛을 추가 할 수 있습니다.

program DelphiCodeToDoc_Tests; 

uses 
    ... 
    XMLTestRunnerProxy, 
    ... 

unit XMLTestRunnerProxy; 

interface 

{$IFDEF XML_OUTPUT} 
uses 
    XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas'; 
{$ENDIF} 

implementation 

end. 
+0

언젠가 사용해야 할 좋은 생각입니다. 하지만이 경우 나는'Marcus Adams'의 대답을 받아 들일 것입니다 – TridenT

+0

+1 "버그 또는 결함은 불쾌한 놀라움을 유발하는 행동입니다." dpr에서 의도적으로 수동 코드를 빼내는 것이 가장 놀라운 일이며 약간 불쾌한 일은 아닙니다! –

5

스트리핑은 IDE는 조선 민주주의 인민 공화국의 uses 절을 수정할 수있는 모든 시간을 발생합니다. 유닛의 이름을 바꾸려면 "다른 이름으로 저장"을 사용하면 동일한 작업을 수행합니다.

은 항상 빈 텍스트 파일로 외부에서 나의 새로운 단위를 만든 다음 수동으로 조선 민주주의 인민 공화국에 추가 그것을 해결하려면. 처음에는 조금 더 많은 작업이 필요하지만 필요한 경우 유닛 만 포함하면됩니다. 또한 Delphi 2005 이후 버전을 사용하는 경우 이런 일이 발생하면 편집 창 하단의 "기록"탭으로 전환하고 "로컬 파일"내용을 복사하여 장치를 가져 오기 전에 버전을 가져올 수 있습니다 추가되었고 다른 모든 것들이 제거되었습니다.

그리고 네, 이것은 버그입니다. QC#6294이 구체적으로 공개되어 있으므로 Embarcadero는이 문제를 알고 있습니다.

+0

그들은이 문제를 알고 있지만, Embarcadero 포럼에서 제기 된 것을 보았을 때, "이것은 의도적으로 설계된 것이며 아마도 미안합니다." 문제. –

+0

저는 Mike Rozlog에게 리팩토링 지원이 제대로 반영되지 않았고 크로스 플랫폼 작업을 어렵게 만들었으며 그의 반응은 그보다 약간 긍정적이라고 말했습니다. 나는 그들이 그것을 더 많이 고칠 가능성이 높을수록 더 많이들을 것이라고 추측하고 있습니다. –

+0

답장과 QC 링크에 감사드립니다. 나는 그것을보아야했다! – TridenT

0

두 개의 프로젝트가 있다고 생각하십시오. 옵션 코드를 사용하면 한 번만 사용할 수 있습니다. 그런 다음 원하는 것을 만들거나 둘 다 만듭니다. 프로젝트 그룹을 사용하면 잘 작동합니다.

+0

네,하지만 두 개의 프로젝트 파일을 동기화해야합니다. 비록 내가 그것을 자주 수정하지 않더라도 하나가 동기화되지 않은 경우가있을 것입니다! – TridenT

관련 문제