2009-05-11 4 views
2

단위 테스트를 처음 접했고 단위 테스트 절차에 대해 알고 싶습니다 (이 경우 프로 시저에서는 "반환"이 아닌 "무언가를 수행하는"함수를 사용합니다). 뭔가 ".단위 테스트 절차 (함수와 반대)

나는 대답을 반환하는 함수를 테스트하는 일반적인 생각이

assert(yourfunction(sample, inputs) == expected_answer); 

같은 것이 있음을 알고 있지만이 뭔가를 반환하지 않는 경우 작업을하거나 단순히 상태 코드를 반환 얼마나 궁금입니다.

답변

2

당신은 그것이 무엇인지 테스트 할 수 있어야합니다. 에스. 예를 들어 프로 시저가 컬렉션에 무언가를 추가합니까? 속성을 설정 하시겠습니까? 파일을 만드시겠습니까?

어쨌든 변경은 아마도 으로 볼 수 있습니다. 그 효과를 확인하는 방법을 알아 내면됩니다. 물론, 때로는 수행하는 것보다 쉽게 ​​할 수 있습니다. 기능적 접근법이 적합 할 때 테스트하기가 더 쉬운 이유입니다. :) 특히 외부 리소스 (파일 시스템, 데이터베이스 등) 및 효과를 수정하는 효과는 입니다.에 의존합니다. 외부 자원 (동등한 것)은 공정하게 "지역적인"방식으로 변화시키는 것보다 테스트하기가 더 어렵습니다.

1

경우에 따라 프로 시저가 수행하는 작업은 다른 종속성에 대한 메서드를 호출하는 것입니다. 그런 경우 의존성 주입 접근법을 사용한다면, 그 의존성을 모의하고, 단정 또는 기대를 사용하여 올바른 매개 변수를 사용하여 의존성에 대해 올바른 메소드가 호출되도록 할 수 있습니다.

1

절차의 경우 "무언가"는 대개 API 호출 또는 기타 개체 조작과 관련됩니다.

예를 들어, 프로시 저는 파일에 행을 쓸 수 있습니다. 파일 I/O API 호출 (또는 파일 IO 개체)을 사용하여이 "행 쓰기"작업을 수행합니다.

당신이하고 싶은 일은 "mock"개체를 작성하여 파일을 표현하는 것입니다. Mock 객체는 테스트 결과를 수집하여 어설 션에 표시 할 수있는 기능을 제공합니다. 귀하의 모의 물건을 덮어 쓰지 마십시오. 잃어버린 시간의 헛소리입니다.

파이썬에서 우리는 이렇게합니다.

class MockFile(object): 
    def __init__(self, aFileName, aMode): 
     self.name= aFileName 
     self.mode= aMode 
     self.buffer= None 
    def write(self, aRow): 
     self.buffer= str(aRow) 

이제 실제 파일 대신이 모의 파일을 절차에 제공 할 수 있습니다. 우리는 일어난 일에 대해 단언 할 수 있습니다.

사례 1 :

public class A 
    { 
     public void Foo() 
     { 
     Init(); 
     } 

     protected virtual void Init() 
     { 
     Do something; 
     } 
    } 

    [TestFixture] 
    public class ATests 
    { 
     [Test] 

     public void Foo_test() 
     { 
     A aStub = new A_Stub(); 
     aStub.Foo(); 
     Assert.IsTrue(aStub.wasInit); 
     } 

     public class A_Stub : A 
     { 
      public bool wasInit; 

      protected override void Init() 
      { 
      wasInit = true; 
      } 
     } 
    } 

사례 2 :

class TestSomeProcedure(unittest.TestCase): 
    def testWrite(self): 
     mockFile= MockFile("name", "w") 
     theProcedureImTesting(args, args, args, mockFile) 
     self.assertEquals("The Row It Was Supposed to Write\n", mockFile.buffer) 
0

많은 다른 경우가 있습니다 당신의 방법 대신 같은 클래스에 속하는 구성원을 실행하는 다른 개체에 따라 달라집니다. 이 경우 Mock 프레임 워크를 사용하는 것이 좋습니다. 나는 Rhino를 사용하고 있습니다. 모의. 이 링크를 따라 Rhino.Mocks examples을 볼 수 있습니다.