TDD,Matrix添加不起作用

时间:2014-09-26 01:11:07

标签: java matrix tdd

Lowdown:开始Java课程。讲座一直是关于收藏的,在概念上没什么太难的。所有理论,不是血液和胆量编码。

实验室,已经完成了一系列完全与讲座无关的编码项目(或者大部分都是如此)。

本实验是关于测试驱动开发的。确切文本是这样的:

为执行矩阵的方法编写测试和实现 在整数矩阵上加法,如下所述。请注意" 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 和那里引用的参考文献。注意矩阵加法的两个属性: 交换性和结合性---你应该验证这些属性。

我的测试代码首次尝试

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的重要性,但它在实施中显然无法实现。

感谢任何帮助人员。

1 个答案:

答案 0 :(得分:1)

您的第一个问题是Java默认情况下不会打印出数组,因此您需要编写arrayPrint方法。

然后,您可以将assertTrue更改为以下内容:

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

如果你的断言失败,那是因为你的addMatricesarrayEquals没有做到你所期望的。断言消息应告诉您哪个,然后您可以调试。

关于如何进行TDD,从理论上讲,你应该将你的(不成文的)功能视为一个黑盒子:东西进入,东西出来,你不关心这种转变是如何发生的。然后,您可以针对某些输入编写一些针对期望开箱即用的测试。在您的矩阵添加示例中,以下将是一个完全合理的TDD测试用例:

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

换句话说,只要您在编写时不知道addMatrices如何工作,您的测试用例就完全可以接受TDD,。从理论上讲,您可以使用这套测试来指导您的开发;如果您未通过测试,您应该能够从失败测试的输出中了解原因。

我在实践中遇到的一个大问题是,如果你不知道该函数应该做什么(例如,如果你不知道矩阵的加法是什么),它可以难以为该功能编写测试。如果发生这种情况,除了你所做的事情之外,我没有任何好的建议。