[..]와 같은 지연된 어설 션을 추가해도 괜찮습니까?
아니 , 그렇지 않습니다. 왜? 어떤 이유로 든 두 번째 주장을 제거하면 테스트가 여전히 녹색으로 바뀌고 여전히 작동한다고 생각하지만 컬렉션이 열거되지는 않습니다. 독립적 인 어설 션이 둘 이상있는 경우이 중 하나를 비활성화하더라도 작업을 계속 수행합니다.
이 조합을 고려하십시오.
Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
이제 어설트 중 하나를 비활성화하거나 제거하더라도 다른 하나는 여전히 작업을 수행합니다. 또한 컬렉션을 구체화하는 것을 잊어 버린 경우 실행하는 데 시간이 오래 걸릴 수 있지만 여전히 작동합니다. 독립적 인 테스트는 더욱 강력하고 신뢰할 수 있습니다.
두 번째 아니오도 있습니다. 다른 프레임 워크가 어떻게 처리하는지 잘 모르겠지만 MS 테스트 플랫폼을 사용하는 경우 어떤 테스트가 실패했는지 알 수 없습니다. 실패한 테스트를 두 번 클릭하면 실패한 것으로 표시 CollectionAssert
되지만 실제로 중첩 된 Assert
것이 잘못되어 디버그하기가 매우 어렵습니다. 예를 들면 다음과 같습니다.
[TestMethod]
public void TestMethod()
{
var numbers = new[] { 1, 2, 3 }.Select(x =>
{
Assert.Fail("Wrong number.");
return x;
});
// This will fail and you won't be sure why.
CollectionAssert.AreEqual(new[] { 1, 2, 3 }, numbers.ToList());
}
즉, 첫 번째 테스트는 버그를 찾는 데 도움이되지 않으므로 실제로는 쓸모가 없습니다. 숫자가 유효하지 않거나 두 컬렉션이 다르기 때문에 실패했는지 여부를 알 수 없습니다.
왜? 구체화 된 컬렉션을 기대하는 진술로도 한 번만 반복 할 수 있습니다.
왜 신경 쓰는지 궁금 하신가요? 이것들은 단위 테스트입니다. 모든 비트를 최적화 할 필요는 없으며 일반적으로 테스트에는 수백만 개의 항목이 필요하지 않으므로 성능에 문제가 없습니다.
그러한 테스트를 유지해야하므로 왜 더 복잡한 테스트를해야합니까? 작동하는 간단한 주장을 작성하십시오.
sequence.WithSideEffect(item => Assert.IsCute(item))
으로 만들어 더 깨끗하게 만들 수 있습니다.