Что делает ваша система?Вы можете начать там.
Предположим, вы пишете функцию, которая считывает документ, содержащий транзакции для данной учетной записи, и генерирует сводную сводку дебетов и кредитов.
Давайте создадим тест:
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
и Summary
еще не существуют, вы создаете их сейчас.Они будут выглядеть так:
TransactionSummarization.java
public class TransactionSummarization {
public Summary summarizeTransactionsIn(Scanner transactionList) {
return null;
}
}
Summary.java
public class Summary {
public double debits;
public double credits;
}
Теперь, когда вы позаботились обо всех ошибках компиляции, которые выможет запустить тест.Это не удастся с NullPointerException
из-за пустой реализации метода summarizeTransactionsIn
.Возвращает сводный экземпляр из метода, и он проходит.
public Summary summarizeTransactionsIn(Scanner transactionList) {
return new Summary();
}
Запустите тест снова и он пройдет.
Теперь, когда у вас есть первый тест, что дальше?Я думаю, что я хотел бы попробовать тест с одной транзакцией.
@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);
}
После запуска теста мы должны увидеть его неудачным, потому что мы не накапливаем значения, просто возвращаем новую Summary
public Summary summarizeTransactionsIn(Scanner transactionList) {
String currentLine = transactionList.nextLine();
txAmount = currentLine.split(",")[2];
double amount = Double.parseDouble(txAmount);
return new Summary(amount);
}
После исправления ошибки компиляции в Summary
и реализации конструктора ваши тесты должны пройти снова.Какой следующий тест?Чему мы можем научиться?Что ж, мне любопытно, что происходит с дебетом / кредитом, так что давайте сделаем это дальше.
@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 #.К сожалению, я сделал это на Java, и мне лень конвертировать его в C #, но я надеюсь, что это все равно поможет.: -)
Спасибо!
Брэндон