最近我不得不改变一些代码在旧的系统中并不是所有的代码有单元的测试。
之前做出的改变,我想写的试验,但各类创造了一个很大的依赖性和其他反模式,其做了测试很难的。
显然,我想重构代码,以使其更易于测试,编写测试,然后改变它。
这是你会怎么做?或者你会花费大量的时间书面难以编写测试,这将是大多删除后重构将完成?

有帮助吗?

解决方案

第一, 这里有一个很大的篇文章提示单元的测试.第二,我找到一个伟大的方式,以避免使吨的变化,旧的代码就是"重构"这一点,直到可以进行测试。一个简单的方法来做到这一点是为了使私有成员受到保护,然后复盖的保护领域。

例如,我们说你有一个类负载一些东西从数据库在构造。在这种情况下,可以不仅复盖受保护的方法,但是可以提取的数据库的逻辑,一个受保护的领域,然后将复盖它在测试。

public class MyClass {
    public MyClass() {
        // undesirable DB logic
    }
}

变得

public class MyClass {
    public MyClass() {
        loadFromDB();
    }

    protected void loadFromDB() {
        // undesirable DB logic
    }
}

那么你的测试,看起来是这样的:

public class MyClassTest {
    public void testSomething() {
        MyClass myClass = new MyClassWrapper();
        // test it
    }

    private static class MyClassWrapper extends MyClass {
        @Override
        protected void loadFromDB() {
            // some mock logic
        }
    }
}

这是有点不好的例子,因为你可能使用DBUnit在这种情况下,但事实上,我这样做是在一个类似的情况下,最近因为我想测试一些功能性完全无关的加载的数据,所以它是非常有效的。我也发现这种暴露的成员是有用的,在其它类似的情况下,我需要摆脱的一些依赖已经在一个类很长一段时间。

我会建议反对这一解决方案,如果你正在写一个框架虽然,除非你真的不介意暴露的成员用户的框架。

它是一个有点黑,但我发现它很有用的。

其他提示

@valters

我不同意你的说法,测试不应该破坏建立。测试应该是一个指示的,应用程序没有新的错误引用的功能进行测试(和发现的错误是一个指示的丢失的试验)。

如果测试不断的建立,然后你可以很容易碰到的情况是新代码断的建立,它是不知道,即使一个测试复盖它。一个失败的测试应该是一个红色的标志,无论是测试或代码可以固定。

此外,允许测试,以不断的建立将导致失败率要慢慢爬,就不再有一个可靠的组回归测试。

如果有问题的测试打破太多时候,这可能是一个迹象,检测正在编写在太脆弱的方式(依赖资源,这可能会改变,例如数据库没有使用DB单元正常,或者一个外部网络的服务,应该嘲笑),或者它可以是指示,也有开发人员团队中,不得测试适当的注意。

我坚信,一个失败的试验应尽快修复,就像你会修复代码,无法编纂。

我不知道为什么你会说这一单元的测试都会被移除一旦重组已完成。实际上你的单元试验套应该运行之后,主要建立(你可以创建一个独立的"试验"修建的,只是运行单位测试后的主要产物是建造的).然后你会立即看到,如果变化在一块打破测试在其他子系统。注意这一点不同于运行测试期间建立(如一些可以倡导者)-一些有限的试验是有用的,在建立,但通常这是非生产性"崩溃"的建立,只是因为一些单元的测试发生的失败。

如果你正在写Java(机会),检查了 http://www.easymock.org/ -可以用于减少联接用于试验目的。

我已经阅读工作有效地与传统的代码,我同意这是非常有用的处理"不可测的"代码。

一些技术只有适用于编制语言(我的工作上"老"PHP应用程序),但是我要说的大多数本书是适用于任何语言。

重构的书籍有时假定的代码是在半的理想或"维护意识到"之前的状态的重构,但是系统的,我的工作不太理想和开发的"了解你去"应用程序,或者作为第一个应用程序用于某些技术用于(而我不责怪的初始开发者,因为我也是其中之一),所以有没有测试在所有的和代码被有时混乱。这本书来解决此种情况,而其他重构的书籍通常不(嗯,不是到这个程度).

我应该提到,我没有收到任何钱从编辑也没有的作者,该书),但是我发现这很有趣,因为缺乏资源领域的遗产代码(特别是在我的语言,法语,但是,这是另一个故事).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top