> Does TDD really work for complex projects?
내 경험으로는 : 예를 들어 (Gui, Mvvm, Business-Modell)과 같은 문제가 없기 때문에 Unittests ( 단독 으로 모듈 / 기능 테스트)에 대해 그렇습니다 . 한 번의 단위 테스트를 완료하기 위해 3 개 이상의 모의 / 스텁이 없었습니다 (그러나 도메인에 더 많은 것이 필요할 수 있습니다).
그러나 TDD가 BDD 스타일 테스트 와 의 통합 또는 엔드 투 엔드 테스트 에서 언급 한 문제를 해결할 수 있는지
확실하지 않습니다 .
그러나 최소한 몇 가지 문제를 줄일 수 있습니다 .
> However complex business logic is hard to test since the number
> of combinations of tests (test space) is very large.
통합 테스트 또는 엔드 투 엔드 테스트 레벨에서 전체 적용 범위를 수행하려는 경우에 해당됩니다. 단위 테스트 수준에서 전체 범위를 다루는 것이 더 쉬울 수 있습니다.
예 : 복잡한 사용자 권한 확인
IsAllowedToEditCusterData()
통합 테스트 레벨 에서 기능 을 테스트하려면 사용자, 도메인, 고객, 환경에 대한 정보를 다른 오브젝트에 요청해야합니다.
이 부분들을 조롱하는 것은 상당히 어렵다. IsAllowedToEditCusterData()
이러한 다른 객체를 알아야 할 경우 특히 그렇습니다 .
Unittest-Level IsAllowedToEditCusterData()
에는 함수가 알아야 할 모든 것을 포함하는 20 개의 매개 변수를받는 함수가 있습니다. 이후
IsAllowedToEditCusterData()
필드 것을 알 필요가 없다 user
하는 domain
하는 customer
, ...이 테스트하기 쉬운 있습니다.
구현해야 할 때 IsAllowedToEditCusterData()
두 가지 과부하가 발생했습니다.
20 개의 매개 변수를 얻은 다음 의사 결정을 수행하는 20 개의 매개 변수로 오버로드를 호출하는 것 이상을 수행하지 않는 하나의 과부하.
(내 IsAllowedToEditCusterData()
매개 변수는 5 개 뿐이며 완전히 테스트하려면 32 가지 조합이 필요했습니다)
예
// method used by businesslogic
// difficuilt to test because you have to construct
// many dependant objects for the test
public boolean IsAllowedToEditCusterData() {
Employee employee = getCurrentEmployee();
Department employeeDepartment = employee.getDepartment();
Customer customer = getCustomer();
Shop shop = customer.getShop();
// many more objects where the permittions depend on
return IsAllowedToEditCusterData(
employee.getAge(),
employeeDepartment.getName(),
shop.getName(),
...
);
}
// method used by junittests
// much more easy to test because only primitives
// and no internal state is needed
public static boolean IsAllowedToEditCusterData(
int employeeAge,
String employeeDepartmentName,
String shopName,
... )
{
boolean isAllowed;
// logic goes here
return isAllowed;
}