이것에서 테이크 아웃은 Fail Fast 입니다.
코드가 없거나 코드에 따라 분기 접두사를 테스트하거나 포함하지 않는 접두사에 대한 많은 예제가 없습니다. 우리가 가진 전부는 이것입니다 :
- 089-100 => 테스트 브랜치
- 10B, 10C => 테스트 브랜치
- <088 => 아마도 실제 분기
- > 100 => 아마도 실제 분기
코드가 숫자와 문자열을 허용한다는 사실은 조금 이상합니다. 물론 10B와 10C는 16 진수로 간주 될 수 있지만 접두사가 모두 16 진수로 처리되면 10B와 10C는 테스트 범위를 벗어나 실제 분기로 처리됩니다.
이는 접두사가 문자열로 저장되지만 경우에 따라 숫자로 처리됨을 의미합니다. 내가 생각할 수있는 가장 간단한 코드는 다음과 같습니다 (설명 목적으로 C # 사용).
bool IsTest(string strPrefix) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix))
return iPrefix >= 89 && iPrefix <= 100;
return true; //here is the problem
}
영어에서 문자열이 숫자이고 89와 100 사이이면 테스트입니다. 숫자가 아닌 경우 테스트입니다. 그렇지 않으면 테스트가 아닙니다.
코드가이 패턴을 따르는 경우 코드를 배포 할 때 단위 테스트에서이를 발견하지 못했을 것입니다. 다음은 몇 가지 단위 테스트 예입니다.
assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change
단위 테스트에 따르면 "10B"는 테스트 분기로 취급되어야합니다. 위의 @ gnasher729 사용자는 비즈니스 규칙이 변경되었으며 위의 마지막 어설 션이 표시됩니다. 어떤 시점에서 assert가로 바뀌 었어 야 isFalse
하지만 그 일은 일어나지 않았습니다. 단위 테스트는 개발 및 빌드 타임에 실행되지만 나중에는 실행되지 않습니다.
여기서 교훈은 무엇입니까? 이 코드는 예상치 못한 입력을 받았다는 신호를 보내는 방법이 필요합니다. 다음은이 코드를 작성하는 다른 방법으로 접두어가 숫자 일 것으로 예상합니다.
// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix)) {
isTest = iPrefix >= 89 && iPrefix <= 100;
return true;
}
isTest = true; //this is just some value that won't be read
return false;
}
C #을 모르는 경우 반환 값은 코드가 주어진 문자열에서 접두사를 구문 분석 할 수 있는지 여부를 나타냅니다. 반환 값이 true이면 호출 코드는 isTest out 변수를 사용하여 분기 접두사가 테스트 접두사인지 확인할 수 있습니다. 반환 값이 false이면 호출 코드는 주어진 접두사가 예상되지 않는다고보고해야하며 isTest out 변수는 의미가 없으므로 무시해야합니다.
예외가 있으면 괜찮을 수 있습니다.
// Alternative B
bool IsTest(string strPrefix) {
int iPrefix = int.Parse(strPrefix);
return iPrefix >= 89 && iPrefix <= 100;
}
이 대안은 더 간단합니다. 이 경우 호출 코드는 예외를 포착해야합니다. 두 경우 모두, 코드는 정수로 변환 할 수없는 strPrefix를 예상하지 않았 음을 호출자에게보고하는 방법이 있어야합니다. 이런 식으로 코드가 빨리 실패하고 은행은 SEC의 훌륭한 당황없이 문제를 신속하게 찾을 수 있습니다.