시스템의 기능은 무엇입니까? 거기에서 시작할 수 있습니다.
주어진 계정에 대한 트랜잭션이 포함 된 문서를 읽고 차변 및 대변의 요약 요약을 생성한다고 가정 해 보겠습니다.
은의 테스트를 만들어 보자 다음 TransactionSummarization
및 Summary
클래스가 아직 존재하지 않는
public class TransactionSummarizationTest {
@Test
public void summarizesAnEmptyDocument() {
TransactionSummarization summarizer = new TransactionSummarization();
Summary s = summarizer.summarizeTransactionsIn(new Scanner());
assertEquals(0.00, s.debits, 0.0);
assertEquals(0.00, s.credits, 0.0);
}
때문에, 당신은 지금을 만들 수 있습니다. 그들은과 같이 보일 것이다 : 이제 당신은 당신이 테스트를 실행할 수있는 컴파일 모든 오류 처리를 찍은 것을
TransactionSummarization.java
public class TransactionSummarization {
public Summary summarizeTransactionsIn(Scanner transactionList) {
return null;
}
}
Summary.java
public class Summary {
public double debits;
public double credits;
}
. summarizeTransactionsIn
메서드를 비어있는 구현으로 인해 NullPointerException
으로 실패합니다. 메서드에서 요약 인스턴스를 반환하면 전달됩니다.
public Summary summarizeTransactionsIn(Scanner transactionList) {
return new Summary();
}
테스트를 다시 실행하면 성공합니다.
이제 첫 번째 테스트가 있으니 다음 단계는 무엇입니까? 단일 트랜잭션으로 테스트를 해보고 싶습니다. 우리는 단순히 Summary
에서 컴파일 오류를 수정 한 후 새 Summary
public Summary summarizeTransactionsIn(Scanner transactionList) {
String currentLine = transactionList.nextLine();
txAmount = currentLine.split(",")[2];
double amount = Double.parseDouble(txAmount);
return new Summary(amount);
}
를 반환하고 생성자 당신을 구현, 값을 축적되지 않기 때문에
@Test
public void summarizesDebit() {
TransactionSummarization summarizer = new TransactionSummarization();
Summary s = summarizer.summarizeTransactionsIn(new Scanner("01/01/12,DB,1.00"));
assertEquals(1.00, s.debits, 0.0);
assertEquals(0.00, s.credits, 0.0);
}
테스트를 실행 한 후, 우리는 실패가 나타납니다 테스트가 다시 통과해야합니다. 다음 시험은 뭐니? 우리는 무엇을 배울 수 있습니까? 글쎄요, 차변/신용에 대해 궁금 해서요. 다음에 해 봅시다.
@Test
public void summarizesCredit() {
TransactionSummarization summarizer = new TransactionSummarization();
Summary s = summarizer.summarizeTransactionsIn(new Scanner("01/01/12,CR,1.00"));
assertEquals(0.00, s.debits, 0.0);
assertEquals(1.00, s.credits, 0.0);
}
실행이 테스트, 우리는 차변이 1.00이기 때문에 그것은 실패 참조해야하지만, 학점은 0.0이다. 정확히 우리가 원했던 것의 반대이지만, 어떤 방식 으로든 트랜잭션 유형을 검사하지 않았기 때문에 완전히 예상됩니다. 이제하자.
public Summary summarizeTransactionsIn(Scanner transactionList) {
double debits = 0.0;
double credits = 0.0;
String currentLine = transactionList.nextLine();
String[] data = currentLine.split(",");
double amount = Double.parseDouble(data[2]);
if("DB".equals(data[1]))
debits += amount;
if("CR".equals(data[1]))
credits += amount;
return new Summary(debits, credits);
}
이제 모든 테스트가 끝나고 다음 테스트로 넘어갈 수 있습니다. 이제 뭐? 나는이 프로젝트가 성공하기를 원한다면 파일에서 한 줄만 처리하면 우리에게 많은 도움이되지 않을 것이라고 생각합니다. 같은 시간에 여러 레코드를 처리하는 것은 어떻습니까? 시험을 치자!
@Test
public void summarizesDebitsAndCredits() {
String transactions = "01/01/12,CR,1.75\\n" +
"01/02/12,DB,3.00\\n" +
"01/02/12,DB,2.50\\n" +
"01/02/12,CR,1.25";
TransactionSummarization summarizer = new TransactionSummarization();
Summary s = summarizer.summarizeTransactionsIn(new Scanner(transactions));
assertEquals(5.50, s.debits, 0.0);
assertEquals(3.00, s.credits, 0.0);
}
지금, 우리의 모든 테스트 실행 우리는이 하나가 예측 가능한 방법으로 실패를 참조하십시오. 첫 번째 기록 만 처리했기 때문에 빚이 0.00이고 크레딧이 1.75라고 알려줍니다.
이제 해결해 보겠습니다. 간단한 while
루프 우리는 사업을 다시해야한다 :
public Summary summarizeTransactionsIn(Scanner transactionList) {
double debits = 0.0;
double credits = 0.0;
while(transactionList.hasLine()) {
String currentLine = transactionList.nextLine();
String[] data = currentLine.split(",");
double amount = Double.parseDouble(data[2]);
if("DB".equals(data[1]))
debits += amount;
if("CR".equals(data[1]))
credits += amount;
}
return new Summary(debits, credits);
}
모든 테스트를 통과하고 내가 당신에게 나머지를 떠날거야. 예를 들어 "cr"대 "CR"과 같은 대소 문자가 혼합 된 파일이나 유효하지 않은/누락 된 데이터 등이있을 수 있습니다.
또한 나는 C#을 언급 한 모든 것을 입력 한 후에도 깨달았습니다. 불행히도 나는 자바에서 그것을했고 C#으로 변환하기에는 너무 게으르다. 그러나 나는 이것이 어쨌든 도움이되기를 바란다. :-)
고마워요!
브랜든
두 개의 학교가있는 것으로 보입니다. 하나는 프로젝트에서 비즈니스 요구 사항을 얻고, 사용자 스토리 등을 수집하고 거기에서 일하는 것처럼 준비하는 것입니다. 다른 접근법은 완전히 유기적 인 것으로 보입니다. 당신은 당신의 프로그램이하기를 원하는 검사들 외에는 아무것도 가지고 있지 않습니다. 두 번째 방법은 테스트의 컨텍스트를 생각하기가 어렵 기 때문에 차단됩니다. 예를 들어 테스트 클래스의 이름을 지정하는 방법을 모릅니다. 그러나 어쩌면 이것은 진화해야 할 필요가있는 것일 수도 있습니다. 어쩌면 나는 테스트 클래스에 약간의 이름을 주어야 할 것인가? 그리고 시간이 지남에 따라 바뀔 것인가? –
@GarthMarenghi. 실제로 모든 것을 설계 한 후에 테스트를 받아야한다고 생각합니다. 그러나 구현하기 전에 테스트를해야합니다. 따라서 한 가지 접근법 만 있습니다. 거의 모든 단계를 거치지 않고 모든 응용 프로그램을 "TDD"하는 것은 어렵습니다. ** 행운을 빌어 요! ** – gdoron