2012-03-10 8 views
0

사람들이 테스트 간의 커플 링 및 "cascaing failure"를 어떻게 처리하는지 궁금합니다. 내가 무엇을 부를지 모르겠다. 그래서 나는 약간의 코드로 설명 할 것이다.단위 테스트, 테스트 간 연결 및 계단식 실패

나는 테스트하고 싶은 간단한 캐싱 클래스를 가지고있다.

이제 클래스의 두 클래스와 메소드를 테스트하고 싶습니다. 여기에 문제가있다. get() 메서드는 set() 메서드에 따라 다릅니다. 따라서 두 가지 방법 중 하나로 테스트 케이스를 작성할 수 있습니다.

class TestCache extends Test 
{ 
    private $cache = null; 
    public function setup() 
    { 
     $this->cache = new Cache(); 
    } 
    public function testSet() 
    { 
     $result = $this->cache->set('foo', 'bar'); 
     $this->asserTrue($result); 
    } 
    public function testGet() 
    { 
     $result = $this->cache->get('foo'); 
     $this->assertEquals($result, 'bar'); 
    } 
} 

여기서 문제는 두 번째 시험이다 testGet() 첫 번째 테스트에서 회신 테스트 세트(). testSet()이 실패하면 testGet()도 실패합니다. 두 가지 테스트 사이에는 일종의 커플 링이 있습니다. 또한 테스트 메소드의 순서를 변경하면 testGet() 테스트가 실패합니다. 그래서 대신 다음과 같은 테스트 케이스를 작성합니다.

class TestCache extends Test 
{ 
    private $cache = null; 
    public function setup() 
    { 
     $this->cache = new Cache(); 
    } 
    public function testSet() 
    { 
     $result = $this->cache->set('foo', 'bar'); 
     $this->asserTrue($result); 
    } 
    public function testGet() 
    { 
     $this->cache->set('foo', 'bar'); 
     $result = $this->cache->get('foo'); 
     $this->assertEquals($result, 'bar'); 
    } 
} 

이제 두 테스트간에 커플 링이 없지만 여전히 문제가 있습니다. Cache :: set() 메서드가 실패하면 Cache :: set()에 대한 두 번째 테스트의 호출이 실패하지 않고 Cache :: set()에 응답하기 때문에 첫 번째 테스트와 함께 두 번째 테스트도 실패합니다.

그래서 저는이 상황과 어떻게 대처할 지 궁금합니다. 한 가지 나쁜 테스트로 인해 테스트 결과에서 수십 번의 실패를 수락합니까? 중요한 시험에 실패하면 수업에 대한 추가 시험을 중단합니까?

답변

2

이것은 @depends 지시문이 phpunit에있는 것입니다. "테스트 종속성"절을 참조하십시오. 종속성이 실패한 경우 해당 초기 테스트에 종속 된 후속 테스트는 건너 뜁니다.

+0

아주 흥미로운 나는 이것이 * 작은 * 유지 보수를 만들어 볼 수 있습니다. 문제는, 그런 것 같습니다. 지불 할 작은 가격. – mellowsoon

0

테스트를 어떻게 실행합니까? TestCache::testSet() 다음에 TestCache::testGet()으로 전화 하시겠습니까? assertTrue()assertEquals()은 무엇을합니까? 그들은 현재 실행 경로를 깨기 위해 예외를 사용합니까?

public function assertTrue($value, $method = "") 
{ 
    if ($value !== true) 
    { 
     throw new Exception("assertTrue() failed on $method, Value $value does not evaluate to true"); 
    } 
} 

그런 다음 몇 가지 시험과 같이 (테스트 세트() & testGet 내부() 메소드 이름을 전달 : Test::assertTrue() 지금과 같이 구현하면하지 않으면 것은, 그 예를 들어 그룹 상호 의존적 테스트에 좋은 방법이 될 것입니다 "캐시 :: 세트"또는 어설 션 기능에 "캐시 :: 얻을"testSet()이 실패 할 경우

try 
{ 
    TestCache::testSet(); 
    TestCache::testGet(); 
} 
catch ($e) 
{ 
    echo("Failed - " . $e->getMessage()); 
} 

이제, 실행을 건너 뛰고 testGet()