2014-09-26 2 views
-1

Lowdown: Начало курса Java. Лекция посвящена коллекциям, и в концепции нет ничего сложного. Вся теория, а не кровь и кишки кодирования.TDD, Матричные дополнения не работают

Лаборатория, была серия кодирующих проектов, совершенно не связанных с лекцией (или, в основном, в любом случае).

Эта лаборатория посвящена разработке, основанному на тестировании. Точный текст такой:

Записывать тесты и реализацию метода, который выполняет матрицу сложения по целочисленным матрицам, как описано ниже. Обратите внимание, что «x» и «y» должны быть равны ; результирующая матрица также будет иметь те же размеры .

public int[][] add(int[][] x, int[][] y); 

См http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html для документации о массивах.

Задача - написать тесты ПЕРЕД записью кода реализации. Удостоверьтесь, что у вас есть хорошее представление о том, какие свойства сложения матрицы , прежде чем пытаться написать код для его выполнения.

Для получения дополнительной информации о добавлении матрицы см. http://mathworld.wolfram.com/MatrixAddition.html и ссылки, цитируемые там. Обратите внимание на два свойства сложения матрицы: Коммутативность и ассоциативность --- вы должны проверить эти свойства.

Код My Test Первая попытка

package tests; 

import static org.junit.Assert.assertTrue; 
import code.Homework4Practice; 

import org.junit.Before; 
import org.junit.Test; 

public class ReferenceTests 
{ 

    private code.Homework4Practice _class; 

    @Before 
    public void setUp() 
    { 
     _class = new code.Homework4Practice(); 
    } 


    @Test 
    public void addMatrice01() 
    { 
     int [][] a = {{1,2}, {1,0}}; 
     int [][] b = {{1,0}, {1,2}}; 
     int [][] expected = {{2,2}, {2,2}}; 
     int [][] actual = _class.addMatrices(a, b); 
     assertTrue("Calling addMatrices with arguments \""+a+"\" and \""+b+"\" I expected the result to be {2,2} {2,2} but instead the result was " +arrayEquals(expected,actual)); 
    } 

    private boolean arrayEquals(int[][] expected, int[][] actual) { 
     if (expected.length != actual.length) { 
      return false; 
     } 
     for (int i=0; i<expected.length; i++) { 
      if (expected[i] != actual[i]) { 
       return false; 
      } 
     } 
     return true; 
    } 

} 

Очевидно, я имею вопрос с assertTrue линии.

Теперь я знаю, что у меня были проблемы, потому что я должен был написать код (и посмотреть его) для добавления матрицы, я знал, как это сделать из других классов, но я не мог правильно его правильно кодировать , Так это то, что код выглядит, как я пытаюсь разработать тесты для:

Моего кода для тестирования

package code; 

public class Homework4Practice 
{ 
    public int[][] addMatrices (int[][] a, int[][]b) 
    { 
     int[][] answer = new int[a.length][a[0].length]; 

     for (int row = 0; row < a.length; row++) 
     { 
      for (int col = 0; col < a.length; col++) 
      { 
       answer[row][col] = a[row][col] + b[row][col]; 
      } 
     } 
     return answer; 
    } 

} 

И с этим я не имею ни малейшего представления о том, как на самом деле идти об этом. Похоже, что в TDD есть много ресурсов, но я не совсем уверен, как их применять здесь. Время хрустнет на меня, и я просто не могу помочь нигде.

Я полностью понимаю и ценю важность TDD, но это явно ускользает от меня в реализации.

Спасибо за помощь.

+0

Я смущен; вы спрашиваете, как писать тесты, не зная, что делает код? –

+0

Я думаю, вы просто хотите запятую в вашем вызове assertTrue(). Не 'assertTrue (" blah "+ arrayEquals (blah))', а вместо этого 'assertTrue (" blah ", arrayEquals (blah))' –

+0

@Jason Baker: В ореховой оболочке, я думаю, так или по крайней мере некоторые полезные подталкивания. – Adam

ответ

1

Ваша первая проблема заключается в том, что Java не будет печатать массивы по умолчанию, поэтому вам нужно написать метод arrayPrint.

Тогда вы можете изменить ваш assertTrue на следующее:

`assertTrue("Expected {{2,2},{2,2}}, got " + arrayPrint(actual), arrayEquals(expected, actual)); 

Если вы неудачу, которые утверждают, что это потому, что либо ваш addMatrices или arrayEquals не делать то, что вы ожидаете.Сообщение assert должно сообщить вам, что, а затем вы можете отлаживать.

Что касается того, как делать TDD, теоретически вы должны относиться к своей (неписаной) функции как к черному ящику: материал идет, а материал выходит, и вам все равно, как это происходит. Затем вы можете написать несколько тестов для того, что вы ожидаете . Ожидается, что выйдет из коробки для определенных входных данных. В вашей матрицы сложения, например, следующий будет вполне разумным тест TDD случай:

Assert addMatrices({{1,2},{1,0}}, {{1,0},{1,2}}) == {{2,2},{2,2}} 

Другими словами, ваш тест вполне приемлемо TDD, до тех пор, как вы не знаете, как addMatrices работал, когда вы написал. Теоретически вы можете использовать этот набор тестов для руководства вашей разработкой; если у вас неудачные тесты, вы должны иметь возможность понять, почему из результатов этих неудачных тестов.

Одна из больших проблем, с которыми я столкнулась на практике, состоит в том, что, если вы не знаете, что должна делать функция (например, если вы не знали, что делает матричное дополнение), это может быть трудно написать тесты для этой функции. Если это случится с вами, у меня нет никаких хороших советов, кроме того, что вы сделали.

Смежные вопросы