2010-02-18 2 views
3

위키 백과에서 테스트 주도 개발은 기능이 존재하지 않기 때문에 실패 할 테스트를 먼저 개발한다고 말합니다. 그런 다음 테스트를 통과하는 코드를 작성하십시오. 이 검사는 어떻게 생겼습니까?만들려는 기능을 가장 잘 나타내는 테스트는 무엇입니까?

만들려는 기능을 가장 잘 나타내는 테스트를 어떻게 파악할 수 있습니까?

예를들 수 있습니까?

웹 응용 프로그램에 로그 아웃 버튼 기능을 만든 경우처럼 테스트에서 버튼을 찾는 페이지를 때리면 좋을까요? 또는 무엇을?

회귀 테스트에 좋은 테스트가 들리는 것을 들었지만, 내 작업과 통합하는 방법을 알지 못합니다.

+0

"만들려는 기능을 가장 잘 나타내는 테스트는 무엇입니까?" 그것이 요점입니다. 이 기능에 대해 생각하고 사용 방법을 생각해야합니다. 기본적으로주의 깊게 디자인해야합니다 *. –

+0

지금 사용자 테스트에 대해 이야기하고 있습니다. TDD는 기능 테스트를위한 것입니다. – Skilldrick

+0

TDD 사용에 대해 진지한 사람이라면 위키 피 디아가 아닌 다른 것을 읽을 것을 제안합니다. –

답변

0

단위 테스트는 로그 아웃 기능을 호출하고 예상 결과가 로그 아웃 버튼을 더 수용 테스트 같은 것 클릭 (사용자 로그인 기록이 예를 들어, 종료)

발생했음을 확인하는 것 - 또한 좋은 해야 할 일, 그리고 TDD의 범위 내에서 (내 의견으로는) 두 가지 기능을 테스트합니다 : 버튼과 결과 동작

+0

ASP.NET 웹 폼을 사용하여 본질적으로 TDD를 처리하기 위해 Selenium을 사용했습니다. HTTP 상태를 조롱하는 것이 기능적 스크립트 테스트를 수행하는 마지막 단계는 실제 TDD와 거의 비슷합니다. 그러나 이상적이지 않습니다. –

0

테스트에서는 로그 아웃 기능이 실행될 때 사용자가 성공적으로 로그 아웃되었습니다. 일반적으로 NUnit 또는 MSTest (.Net 항목)와 같은 단위 테스트 프레임 워크가 사용됩니다.

웹 응용 프로그램은 일반적으로 웹 서버에서 서버 코드를 실행하는 데 필요한 모든 컨텍스트 정보로 인해 단위 테스트가 어렵다는 것을 잘 알고 있습니다. 그러나 일반적인 예에서는 해당 정보를 모방하고 로그 아웃 논리를 호출 한 다음 올바른 결과가 반환되었는지 확인합니다. 느슨한 예는 NUnit를하고 Moq를 사용하여 MVC 형 테스트입니다 :

[Test] 
public void LogoutActionShouldLogTheUserOut() 
{ 
    var mockController = new Mock<HomeController>() { CallBase = true }; 
    var result = mockController.Object.Logout() as ViewResult; 

    Assert.That(result.ViewName == "LogoutSuccess", 
       "Logout function did not return logout view!"); 
} 

정말 그냥 "LogoutSuccess"보기 및되지 않은 로그 아웃 로직이 실행 된 것으로, 반환 된 것을 테스트하고 있기 때문에이 느슨한 예입니다. 실제 테스트에서는 HttpContext를 조롱하고 세션이 지워지는지 여부를 확인했지만 방금 복사했습니다.)

유닛 테스트를 통해 UI 요소가 이벤트 처리기에 제대로 연결되었는지 테스트 할 수 없습니다. 전체 응용 프로그램이 위에서 아래로 작동하도록하려면 통합 테스트라고하고 단위 테스트 외에 다른 것을 사용합니다. Selenium과 같은 도구는 일반적으로 웹 통합 테스트에 사용되는 반면 매크로 기록 프로그램은 종종 데스크톱 응용 프로그램에 사용됩니다.

0

테스트가 어떻게 나타날지에 따라 사용하는 플랫폼에 따라 다릅니다. TDD는 ASP.NET MVC보다 ASP.NET WebForms에서 훨씬 어렵습니다. ASP.NET MVC와 달리 Session, Application, ViewState 등의 예상되는 상태를 얻기 위해 WebForms의 HTTP 환경을 모의하기가 매우 어렵 기 때문입니다.

일반적인 테스트는 어레인지 액트 어서 트 (Arrange Act Assert)를 기반으로합니다.

// Arrange 
... setup needed elements for this atomic test 

// Act 
... set values and/or call methods 

// Assert 
... test a single expected outcome 

코딩하려는 플랫폼을 알려주지 않는 한 깊은 예제를 제공하는 것은 매우 어렵습니다. 더 많은 정보를주세요.

+0

.NET MVC에서 동작에 대한 호출을 만들고 HTTP + HTML 대신 테스트 클래스 (C#)에서 결과를 소비하는 방법은 무엇입니까? – BigOmega

+0

이 예제 이외의 여러 Assertations (1 Assert, 1 Assert)를 수행합니다. ASP.NET MVC를 사용하여 요청하는 작업을 수행하는 좋은 예입니다. http://weblogs.asp.net/shijuvarghese /archive/2009/07/22/introduction-to-test-driven-development-with-asp-net-mvc.aspx –

0

말 (실제로 간단한 예) 하나에 숫자를 추가하는 함수를 만들고 싶습니다.

먼저 f(10) == 11이라는 테스트를 작성한 다음 f(10) != 10이라는 테스트를 작성하십시오. 그런 다음 해당 테스트를 통과하는 함수를 작성하십시오. 함수에 더 많은 기능이 필요하다는 것을 알고 있으면 더 많은 테스트를 추가하십시오.

2

분명히 다른 것들보다 TDD에 더 적합한 영역이 있으며, 실행중인 프론트 엔드 개발은 TDD를하기가 어려운 영역 중 하나입니다. 하지만 넌 할수있어.

WATIN 또는 WebAii을 사용하면 이러한 종류의 테스트를 수행 할 수 있습니다. 그런 다음 수 :

  • 버튼이 페이지에 있는지 확인하는 테스트를 작성 ... 그것을 실패, 다음을 구현하고
  • 가 버튼을 클릭 테스트를 작성 통과, 뭔가에 대한 검사에 프론트 엔드에서 변경, 실패, 기능 구현 및 테스트 통과.

그러나 일반적으로 사용자가 수행 한 작업의 논리를 테스트합니다. webforms의 이벤트 핸들러 또는 MVC의 컨트롤러 작업에서 호출하는 인증 서비스의 로그 아웃 기능을 테스트합니다.

1

이 테스트는 어떻게 생겼습니까?

테스트는 3 부분으로 구성됩니다.

  1. 이 컨텍스트를 설정이 작업을 수행
  2. 는 조치가 당신이 무엇을 테스트합니다 알아낼 어떻게

수행 할 작업을했는데 않았다고 주장한다

  • 만들려는 기능을 가장 잘 나타내야합니까? 테스트는 기능을 기반으로하지 않으며 ( cucumber과 같은 상위 수준의 프레임 워크에 대해 언급하지 않는 한) 코드의 "단위"를 기반으로합니다. 일반적으로 단위는 함수이며, 함수의 모든 가능한 동작이 올바르게 작동한다고 주장하는 여러 테스트를 작성합니다.

    예를들 수 있습니까? 정말 사용하는 프레임 워크에 따라 다릅니다. 개인적으로, 내가 좋아하는 것은 루비 Test :: Unit framework의 확장 인 shoulda이다.

    다음은 readme의 예제이다. 나는 다음 테스트 버튼을 찾는 페이지를 치는 것 웹 응용 프로그램에 로그 아웃 버튼 기능을 할 경우이 같은 BDD 프레임 워크의 경우, 상황에 맞는 설정은 자신의 블록처럼

    class UserTest < Test::Unit::TestCase 
        context "A User instance" do 
         setup do 
         @user = User.find(:first) 
         end 
    
         should "return its full name" do 
         assert_equal 'John Doe', @user.full_name 
         end 
    
         context "with a profile" do 
         setup do 
          @user.profile = Profile.find(:first) 
         end 
    
         should "return true when sent #has_profile?" do 
          assert @user.has_profile? 
         end 
         end 
        end 
        end 
    

    에 어떻게됩니까? 또는 무엇을?

    세 가지 주요 유형의 테스트가 있습니다.

    먼저 단위 테스트를합니다 (사람들이 일반적으로 TDD 테스트에 대해 이야기 할 때 말하는 것으로 가정합니다). 단위 테스트는 단일 작업 단위를 테스트하며 그 외에는 테스트하지 않습니다. 즉, 일반적으로 메서드가 데이터베이스에 도달하면 테스트 기간 동안 해당 데이터베이스에 실제로 충돌하지 않도록합니다 ("조롱 (mocking)"이라는 기술 사용).

    다음에는 통합 테스트가 있습니다. 통합 테스트는 일반적으로 인프라와의 상호 작용을 포함하며 더 "전체 스택"테스트입니다. 따라서 최상위 API에서 삽입 메소드가있는 경우 전체 삽입을 수행 한 다음 결과 데이터를 데이터베이스에서 테스트하십시오. 이러한 종류의 테스트에는 더 많은 설정이 있기 때문에 실제로는 개발자 머신에서 실행해서는 안됩니다 (빌드 서버에서 자동화하는 것이 더 좋습니다).

    마지막으로 UI 테스트가 있습니다. 이것은 가장 신뢰할 수 없으며 UI 주위를 클릭하는 것을 자동화하기 위해 Selenium 또는 Waitr과 같은 UI 스크립팅 프레임 워크가 필요합니다. 이 테스트는 매우 약하다 (작은 변화는 그들을 깨뜨릴 수있다) 고하며, 어쨌든 (예 : 스타일링과 같은) 전체 클래스의 클래스를 잡아 내지 못하기 때문에 이런 유형의 테스트에는 미친 짓이 마세요.

    관련 문제