2009-03-04 2 views
2

나와 나와 동료가 새 프로젝트를 시작하고 TDD를 최대한 활용하려고합니다. 우리는 여전히 단위 테스트를 둘러싼 모든 개념을 파악하고 있으며, 다른 예제를 중심으로이를 기반으로합니다.단위 테스트 제약 조건과 NUnit 구문 도우미 이해

제 동료는 최근 NUnit 구문 헬퍼에 대해 의문을 제기했으며, 나는 (내 직감이 좋다는 것을 제외하고는 자신이 실제로 이해하지 못하기 때문에) 자신의 이점을 설명하기 위해 고심하고 있습니다.

Assert.That(product.IsValid(), Is.False); 

이, 우리는 우리가 product.IsValid()의 값이 false 될 것으로 기대 말을하는지 완전한 의미가 나에게 예를 들면 다음과 같습니다 주장이다. 내 동료는 다른 한편으로는 단순히 다음과 같이 작성하는 것이 더 좋을 것입니다.

Assert.That(!product.IsValid()); 

그는이 말이 더 의미가 있으며 더 쉽게 읽을 수 있다고 말합니다.

지금까지 우리가 동의 할 수있는 유일한 점은 테스트가 이전 테스트에서 실패했을 때 더 많은 도움이되는 결과를 얻을 수 있다는 것입니다. 그러나 더 나은 설명이 있어야한다고 생각합니다. 구문 도우미 (http://nunit.com/blogs/?p=44)에 대한 정보를 찾아 보았지만 이해할 만하지만 '느끼는 것'이외의 제약 조건 개념을 완전히 이해하지 못했습니다.

왜 누군가가 제약 개념을 사용하는지 설명 할 수 있을까요? 그리고 위의 단위 테스트 예제를 개선하는 이유는 무엇일까요?

감사합니다.

+0

여기에 실제로 정교한 제약을 사용하는 예 http://geekswithblogs.net/mrsteve/archive/2012/02/13/writing-readable-unit-tests-clean-code-handbook-agile-software-craftsmanship.aspx –

답변

4

저는 주로 문장의 순수 영어 읽기와 관련이 있다고 생각합니다. 해당 제품은 유효가

두 번째는

개인적으로 찾을 수없는 제품이 유효한지

어설를 읽고 거짓입니다 주장

첫 번째는

를 읽고 첫 번째로 처리하기 쉽습니다. 내 생각에 모든 것이 우선적 인 것 같아.

product.IsValid().IsFalse(); 
+0

구문 헬퍼에 대한 제 견해는 기본 제약 조건의 목적을 찾는 것입니다. 아니면 같은 이유로 문법 헬퍼가 개선 되었습니까? – roryf

+0

나는 assertions를 문장처럼 들리게하기 때문에 syntax helper를 아주 좋아한다. 그러나 나는 정상적인 구문을 매우 편안하게 사용하고 있으므로 다른 사람이 구문 도우미를 사용하도록 할 이유가 없습니다. – mezoid

+0

기본 제약 조건이 전혀 변경되지 않았다고 생각합니다. 그것은 단지 구문상의 차이 일뿐입니다. –

3

내가 버전이 동료들보다 더 나은 것을 볼 수 있습니다 그건 당신이 이런 식으로 당신에게 주장을 할 수 있지만 거기 확장 방법 중 일부는 흥미 롭다. 그러나 나는 아직도 적어도 편안 것 : 당신이 Assert.That 구문은 위 이상 목표 이익을 가지고 저를 설득 할 수있는 경우

Assert.IsFalse(product.IsValid()); 

, 나는 매우 관심이있을 것입니다 : 그것은 잘 단지 강제 할 수있다 "나는 어떤 종류의 주장을하고 있는가? 이제 우리는 무엇에 관해 주장 할 것인가?" 스타일.

+0

좋은 점은 아마도 문제는 잘못된 주장을 사용하고 있다는 것입니다. 공정하게 그것은 다른 곳에서 복사했기 때문에 나는 관례대로 지냈다. – roryf

+0

@Rory : 나는 Assert를 사용하는 사람들을 보았다. 이것과 같은 경우에 대해서만, 그래서 그것은 당신뿐이 아니다. "잘못된"방법이 있다고 생각하지 않습니다. 저는 Assert의 이점을 알고 싶습니다.이 경우에는, 하나 있다면. –

1

모두 설탕입니다. 내부적으로 그들은 제약 조건으로 변환됩니다.

"NUnit과 2 : 실용 단위 테스트, 페이지 37에서

.4는 새로운 스타일의 어설 션을 도입했다.이 스타일은 좀 덜 절차 적이며보다 객체 지향적 인 기본 구현을 허용한다. 제약 조건을 사용하여 또한 제약에서 상속 일관된 구문을 유지하면서 사용자 정의 제약 조건 (들)을 만들 수 있습니다

Assert.That(actual, new EqualConstraint(expected));" 

: 예를 들어 ... :에

Assert.That(actual, Is.EqualTo(expected)); 

변환합니다.

0

저는 Assert.That을 좋아하지 않습니다. 특히 두 가지 객체의 동등성을 비교하는 가장 일반적인 시나리오가 '고전적'Assert.AreEqual() 구문보다 현저히 나쁘다는 사실입니다.

한편, 나는 MSpec NUnit 확장을 매우 좋아합니다. 내가 체크 아웃하는 것이 좋습니다 (또는 SpecUnit 확장 또는 NBehave 확장을 보거나 N 동작 Spec * 유닛 확장, 그들은 모두 같아요).

관련 문제