매우 복잡한 실제 비즈니스 객체에 해당하는 클래스가있는 Java로 작성된 분산 시스템 프로젝트에 있습니다. 이러한 객체에는 사용자 (또는 다른 에이전트)가 해당 객체에 적용 할 수있는 작업에 해당하는 많은 방법이 있습니다. 결과적으로 이러한 클래스는 매우 복잡해졌습니다.
시스템 일반 아키텍처 접근 방식은 몇 가지 클래스와 가능한 많은 상호 작용 시나리오에 집중된 많은 동작으로 이어졌습니다.
예를 들어 물건을 쉽고 명확하게 유지하기 위해 로봇과 자동차가 내 프로젝트의 수업이라고 가정 해 봅시다.
따라서 Robot 클래스에는 다음과 같은 패턴으로 많은 메소드가 있습니다.
- 자다(); isSleepAvaliable ();
- 깨다(); isAwakeAvaliable ();
- 도보 (방향); isWalkAvaliable ();
- 촬영 (방향); isShootAvaliable ();
- turnOnAlert (); isTurnOnAlertAvailable ();
- turnOffAlert (); isTurnOffAlertAvailable ();
- 재충전 (); isRechargeAvailable ();
- powerOff (); isPowerOffAvailable ();
- stepInCar (자동차); isStepInCarAvailable ();
- stepOutCar (자동차); isStepOutCarAvailable ();
- selfDestruct (); isSelfDestructAvailable ();
- 주사위(); isDieAvailable ();
- 살아있다(); isAwake (); isAlertOn (); getBatteryLevel (); getCurrentRidingCar (); getAmmo ();
- ...
Car 클래스에서는 다음과 유사합니다.
- 켜다(); isTurnOnAvaliable ();
- 끄다(); isTurnOffAvaliable ();
- 도보 (방향); isWalkAvaliable ();
- 연료 보급 (); isRefuelAvailable ();
- selfDestruct (); isSelfDestructAvailable ();
- 크래시(); isCrashAvailable ();
- isOperational (); isOn (); getFuelLevel (); getCurrentPassenger ();
- ...
이러한 각 (로봇 및 자동차)은 상태 머신으로 구현되며 일부 상태에서는 일부 작업이 가능하고 일부는 불가능합니다. 동작은 객체의 상태를 변경합니다. IllegalStateException유효하지 않은 상태에서 호출되면 조치 메소드가 발생하고 isXXXAvailable()메소드는 해당 시점에 조치가 가능한지 알려줍니다. 일부는 상태에서 쉽게 추론 할 수 있지만 (예 : 수면 상태에서 깨어 있음), 그렇지 않은 경우도 있습니다 (사격하려면 깨어 있어야합니다.
또한 객체 간의 상호 작용도 복잡합니다. 예를 들어, 자동차는 한 명의 승객 만 탑승 할 수 있으므로 다른 승객이 입장하려고하면 예외가 발생합니다. 차가 추락하면 승객은 사망해야합니다. 로봇이 차량 안에서 죽었다면, 차 자체가 괜찮아도 밖으로 나갈 수 없습니다. 로봇이 차 안에 있다면, 밖으로 나가기 전에 다른 로봇에 들어갈 수 없습니다. 기타
이것의 결과는 이미 말했듯이이 클래스는 정말 복잡해졌습니다. 설상가상으로, 로봇과 자동차가 상호 작용할 때 수백 가지의 가능한 시나리오가 있습니다. 또한 그 논리의 대부분은 다른 시스템의 원격 데이터에 액세스해야합니다. 결과적으로 단위 테스트는 매우 어려워졌으며 많은 테스트 문제가 발생하여 하나는 악순환으로 이어졌습니다.
- 테스트 케이스 설정은 실행하기 위해 상당히 복잡한 세계를 만들어야하기 때문에 매우 복잡합니다.
- 테스트 횟수는 엄청납니다.
- 테스트 스위트를 실행하는 데 몇 시간이 걸립니다.
- 우리의 테스트 범위는 매우 낮습니다.
- 테스트 코드는 테스트하는 코드보다 몇 주 또는 몇 개월 후에 작성되거나 전혀 작성되지 않는 경향이 있습니다.
- 주로 테스트 된 코드의 요구 사항이 변경 되었기 때문에 많은 테스트가 중단되었습니다.
- 일부 시나리오는 너무 복잡하여 설정 중에 시간 초과시 실패합니다 (각 테스트에서 시간 초과를 구성했습니다. 최악의 경우 2 분, 시간이 너무 길어도 무한 루프가 아님).
- 버그는 정기적으로 프로덕션 환경으로 미끄러 져 들어갑니다.
로봇과 자동차 시나리오는 우리가 실제로 가지고있는 것을 지나치게 단순화 한 것입니다. 분명히이 상황은 관리 할 수 없습니다. 그래서 저는 다음과 같은 도움과 제안을 요청합니다. 1, 수업의 복잡성을 줄입니다. 2. 내 객체 간의 상호 작용 시나리오를 단순화합니다. 3. 테스트 시간과 테스트 할 코드의 양을 줄입니다.
편집 :
나는 상태 머신에 대해 명확하지 않다고 생각합니다. 로봇 자체는 "잠자기", "깨어나 기", "충전", "죽음"등의 상태 머신입니다. 자동차는 다른 상태 머신입니다.
편집 2 : 내 시스템이 실제로 무엇인지 궁금한 경우 상호 작용하는 클래스는 서버, IP 주소, 디스크, 백업, 사용자, SoftwareLicense 등입니다. 로봇 및 자동차 시나리오는 내가 찾은 사례입니다. 그것은 내 문제를 설명하기에 충분히 간단합니다.