단위 테스트를 수행 할 거리


11

질문은 여러 번 요청되었지만 특정 경사 twds mvc 개발과 관련이 있습니다.

나는 아주 좋은 소년이었고 위대한 모든 대응하는 단위 테스트로 모든 컨트롤러 작업을 코딩했습니다 (때로는 반복적으로 많은 것을 읽으십시오). 솔직히 말해서, 실제로 초기 단위 테스트의 베어 본을 작성하기 위해 작은 T4 템플릿을 만든 다음 사용법에 따라 적절하게 조정했습니다. Partialview를 포함하는 뷰에서 테스트를 처리하는 방법을 잘 모르겠다는 점은 인정하지만 다른 질문에 대한 이야기입니다.

이제 결정하기 어려운 부분은 서비스 계층에 적용 범위가 얼마나 깊어 야 하는가입니다. 그 이유는 (더 나은 또는 나쁜) 내 서비스 방법 중 일부가 실제로 다양한 linq 쿼리를 수행하여 방법 내의 후속 논리에 신중한 정보를 제공하기 때문입니다. 각 linq 문에 필요한 논리 만 호출하도록 메소드를 분류 한 다음 메소드 내에 적용 할 수 있다는 것을 알고 있습니다. 그러나 많은 경우에 linq '함수'를 재사용 할 수 없으므로 코드를 너무 멀리 리팩토링 할 것이라고 생각합니다.

내가 묻는 것은 복잡한 논리가 메소드 내에서 발생한다는 것만으로 필요한 결과 및 / 또는 예상 오류를 단순히 주장하는 테스트 메소드를 갖추거나 모든 논리 라인을 시뮬레이션하고 테스트해야한다는 것이 '충분히 좋은 것'입니다. 내가보고있는 방식으로, 테스트를 올바르게 수행하려면 메소드 로직 (한 줄씩)도 일종의 적용 범위를 가져야합니다. 그러나 (내 순진한 견해로는) 테스트 자체에서 코티지 산업을 만들기 위해 테스트와 구현 방법을 밀접하게 정렬하려고 노력하는 끝없는 주기로 이어질 수 있습니다.

나는 내 질문에이 문제를 전혀 생각하지 않는 TDD 열렬한 사람들에게 불쾌감을 줄 수 있다는 것을 알고있다. TDD 캠프에 있지 않은 것은 이것이 나에게 '그렇다'는 질문입니다.

btw-아이디어를 확인했습니다.

http://dotnetslackers.com/articles/aspnet/Built-in-Unit-Test-for-ASP-NET-MVC-3-in-Visual-Studio-2010-Part-1.aspx

꾸준한 downvotes에 지금 fwd 찾고 :)

[편집] -독신 (현재 단식 !!) 유권자의 이익을 위해. 이 질문은 주관적 이지 않습니다 . 나는 매우 집중된 주제에 대한 컨센서스를 찾고 있습니다. 나는 부정적인 열정을 불러 일으키려고하지 않고, 기술의 결함을 드러내고 싶지 않다. 나는 거대한 팬이다. 모호하거나 잘못된 정보가있을 경우 질문을 재구성하는 데 도움이 될 수 있으므로 투표를 마치면 혜택에 대해 공손한 의견을 남겨주십시오. 이 질문은 많은 mvc 인구 집단에 도움이 될 수 있습니다.

감사합니다!!


(첫 번째) 투표 마감은 내 것이지만 '주관적이고 논쟁 적'(이것은 아님)이 아니라 'programmers.stackexchange.com으로 마이그레이션'입니다. 이는 단일 질문에 대한 특정 프로그래밍 질문이 아니기 때문에 명확한 답변.

aakashm, 감사하고 이해합니다. 발굴이 아니 었습니다. :)
jim

답변:


4

먼저 당신이 말하는 것은 TDD처럼 들리지 않습니다. TDD는 Test-> Code-> Refactor 패턴에 따라 시스템 설계를 주도하는 테스트 우선 접근 방식을 의미합니다 . 아마도 첫 번째 문제는 테스트의 목적 일 것입니다. 코딩 할 때 작성합니까? 그렇다면 테스트의 모든 논리가 일부 단위 테스트와 관련이 있다고 생각합니다. 따라서 높은 코드 적용 범위는 TDD를 적용한 간접적 인 결과입니다.

TDD를 수행 할 때 작성하려는 코드에 동기를 부여하기에 충분한 테스트 코드를 작성하십시오. 또한 테스트 먼저 실패 했는지 확인하십시오 . 기본적 으로이 방법이 무엇을 해야하는지 스스로에게 물어보십시오. 그런 다음 코드를 작성하지만 테스트를 통과하기에 충분합니다. 원하는 것이 아닌 경우 추가 테스트를 작성한 다음 메소드를 리팩터링하십시오.

사실 이후의 코드 적용 범위는 TDD 준수를 측정하는 효과적인 방법이 아니지만 일반적으로 TDD를 사용하여 작성된 코드에서 매우 높은 코드 적용 범위는 모든 코드가 일부 테스트에 의해 동기 부여되어야한다는 사실을 알 수 있습니다.

TDD 테스트는 디자인과 문서를 구동하고 다른 언어로 디자인을 일반 언어로 설명하는 데 사용됩니다 (따라서 테스트 이름을 지정하는 방법이 매우 중요합니다).

그러나이 혼란스러운 것은 실제로 귀하의 질문에 직접 대답하지 않으므로, UI가 아닌 코드, 특히 경쟁이 아닌 논리가있는 곳, 테스트가 더 나은 경우에는 더 높은 코드 적용 범위를 목표로 삼아야합니다 먼저 작성 ;-). 사실은 더 많은 테스트가 일반적으로 더 낫다는 것입니다 (일부는 동의하지 않을 수도 있음). 많은 고품질 오픈 소스 프로젝트는 코드를 실행하는 것보다 훨씬 많은 테스트 코드를 가지고 있습니다.

또한 다음과 같은 경우에도 테스트를 작성해야합니다.

  1. 새로운 코드를 작성하고 있다면 테스트를 통해 설계를 주도하고 문서화해야하며 코드의 기능에 대한 가정을 설명해야합니다. 코딩하기 전에 작성해야합니다.

  2. 버그를 발견하면 실패한 테스트에서 버그를 보여 주어야합니다. 버그가 수정되면 테스트를 통과해야합니다.

  3. 메소드 또는 클래스의 특성을 변경하는 방식으로 코드를 변경합니다 (코드의 한 영역이 변경되어 많은 테스트가 실패하는 경우 취성 테스트를 나타낼 수 있음). 이렇게하면 테스트가 코드를 올바르게 문서화합니다.

개인적으로, 저는 TDD를 배우는 것이 흥미로운 도전이라는 것을 알았습니다. 그리고 좋은 "장감"을 개발하는 데 시간이 걸립니다. 연습, 연습, 연습은 저에게 가장 좋은 방법이었습니다. 오픈 소스 프로젝트에서 테스트 코드를 읽고 내 변경 사항으로 새 테스트를 작성하는 데 기여했습니다.


+1 chris-나는 당신의 지브 절단을 좋아하지만, 더 중요한 것은 단위 테스트와 TDD 사이의 분리를 지적합니다. 광산은 다소 하이브리드 모델입니다 (yikes !!)
jim

네, 아마 당신이 잘 알고 있었지만 그래도 언급 할 가치가 있다고 생각했습니다. 또한 우리 모두는 다소 하이브리드 모델을 가지고 있다고 생각합니다. 나는 최근에 더 많은 테스트를하고있는 것을 발견했다. MSpec 및 사양 스타일 테스트로 전환하는 것이 도움이되었다고 생각합니다. 여전히 일부 코드를 작성하지만 먼저 테스트하기 위해 귀찮게 할 수는 없습니다.
Chris Nicola

... 나는 당신의 최종 문장에 동의하여 부끄럽게 고개를 끄덕이고 있습니다 :)
jim

0

메소드의 리턴 값만 테스트하는 것이 메소드 내의 모든 분기를 테스트하는 것보다 덜 강력하다는 것은 분명합니다. 대체 입력이 올바른 동작을 보장하지는 않습니다.

반면에 모든 것을 테스트하기에 충분한 시간이나 인내심이 없을 수도 있습니다.

당신이 할 수있는 일은 테스트로 덮을 코드의 양 (80-90 % 또는 기타)을 결정하고 이것을 검증하는 자동화 도구를 사용하여 시행합니다.
코드 작성주기가 끝나지 않는 경우에만 쓰기 테스트의 "결말주기 없음"이 발생합니다. :)


cosmin-당신은 분명히 내 코드를 보지 못했습니다. 러닝 머신으로 돌아 가기 ... :-)
jim

0

코드가 제대로 작동하기를 얼마나 확신하십니까? 단위 테스트는 프로그래머가 구현 한 사양 중 하나에서 구현이 사양에 맞는 기능을 수행하는지 확인하는 데 도움이되는 도구 중 하나 일뿐입니다. 100 % 적용 범위는 필요하지 않지만 코드의 더 중요한 부분을 다루기 위해 단위 테스트를 작성해야합니다. 항상 혼자서가 아니라 메서드가 잘 작동하는지 확인하는 것이 좋습니다. 따라서보다 중요한 "논리적 라인"을 다루는 테스트를 작성해야합니다.


0

Visual Studio에서 코드 적용 범위를 켠 상태에서 단위 테스트를 실행하면 코드가 얼마나 잘 적용되는지에 대한 좋은 (및 그래픽) 표시가 제공됩니다.

기본 제공 MSTest 프레임 워크를 사용하지 않는 경우 NUnit과 함께 작동하거나 다음 지침에 따라 타사 코드 적용 제품을 확인해야합니다. /programming/2665799/does-vs2010-code 적용 범위 지원

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