2016-08-02 1 views
0

세 가지 테스트, FunnyCarSteps.cs, CarLotMaxSteps.csCarTypeSteps.cs이 있습니다. seperatley를 실행하면 모두 통과하지만 CarLotMaxSteps 만 실행하면 통과합니다.3 개의 단위 테스트가 개별적으로 실행될 때 합격, 함께 실행될 때 하나만 통과 함

CarTypeSteps.cs는 소스 코드가없는 람다 메서드로 49 행에서 실패합니다. FunnyCarSteps.cs가 범위를 벗어난 인덱스를 가진 라인 19에서 실패합니다.

본인은 단위 테스트를 처음 사용하고 있으며 무엇이 진행되고 있는지 이해하지 못합니다.

도움을 주시면 대단히 감사하겠습니다.

+1

Program() 클래스 구현을 살펴볼 필요 없이는 불가능합니다. 인스턴스 간 정적 공유 데이터가있는 것 같습니다. – mrAtari

+0

** CarLotMaxSteps 클래스의 ** Given ** IHaveAFullCarlot 메소드에서 'carLotMaxProgram.CarList.Clear();'를 호출합니다. 거기에 어떤 이유가 있습니까? 테스트 시작시 정리를해야 할 필요성은 테스트 간의 종속성을 나타냅니다. –

+0

그건 문제가 mrAtari! 고맙습니다. – CryptoJones

답변

3

Program.Mainstatic이므로 CarList은 아마도 정적 일 것입니다. NUnit은 테스트를 병렬로 실행하기 때문에 각각의 테스트가 거의 동시에 실행되며 각 테스트는 동시에 지워지고 동시에 추가됩니다.

그렇기 때문에 테스트가 독자적으로 올바르게 실행되지만 함께 실행하면 실패하는 것입니다. 하나는 시작하고 테스트를 시작한 다음 두 번째 테스트가 시작되고 첫 번째 테스트에서 작동하는 데이터가 변경됩니다.

메인을 제외한 Program의 모든 항목에서 정적을 제거해야합니다. 이상적으로, 모든 비표준 클래스에 대한 자동차 목록 코드를 모두 리팩터링해야합니다. 프로그램은 프로그램을 실행하기위한 것이므로 자동차와 관련이 없어야합니다. Main에 CarLot (또는 무엇이든) 클래스를 작성하고 실행해야하며, 프로그램에 특성을 추가하지 않아야합니다.

다른 옵션은 각 테스트 클래스에 [Parallelizable(ParallelScope.None)] 속성을 추가하는 것입니다. 이로 인해 한 번에 하나씩 실행됩니다. 이렇게하면 테스트의 문제가 해결되지만 간단한 연습 이외에 코드가 올바르지 않다는 사실이 수정되지는 않습니다.

+0

와우! 당신은 절대적으로 옳았습니다. 내 프로그램에는 다음과 같은 정적 클래스가 있습니다. http://pastebin.com/pquTVmu4 나는 그것들을 정적 변수에서 인스턴스 변수로 변경했고 모두 성공적으로 실행하기 시작했다. 고맙습니다. Prouse 씨! – CryptoJones

+1

GlobalVariables라고하는 Anthing은 즉시 의심 스럽습니다.) –

+1

물론 NUnit은 기본적으로 테스트를 병렬로 실행하지 않습니다. 그렇게하려면 테스트를 수행해야합니다. 그러나 공유 정적은 어떤 경우에도 문제를 일으킬 수 있습니다. – Charlie

관련 문제