3

进行考虑不同类层次结构的单元测试的最佳方法是什么,例如:

我有一个基类Car和另一个基类Animal

Car 具有派生类VolksWagenFord. Animal 有派生类DogCat.

您将如何开发在运行时决定您将使用哪种对象的测试。考虑到这些测试将应用于来自不同层次结构的数百万个对象,在不使用代码复制的情况下实现此类测试的最佳方法是什么?

这是我的一个朋友问的一个面试问题。

4

3 回答 3

1

我看到的问题:避免重复常见的测试来验证一个常见的基本类型的 n 派生。

  • 创建一个抽象的测试夹具。在这里,您使用抽象方法 GetTestSubject() 在抽象基类(搜索术语“抽象测试夹具”)中针对基类型 & 编写测试。此类型的派生会覆盖该方法以返回要测试的类型的实例。因此,您需要使用单个重写方法编写 N 个子类型,但您的测试将只编写一次。
  • 一些单元测试框架,如 NUnit 支持“参数化测试”(搜索词)——您必须在其中实现一个方法/属性,该方法/属性将返回需要运行测试的所有对象。然后它将在运行时针对每个这样的对象运行一个/所有测试。这样您就不需要编写 N 个推导 - 只需一种方法。
于 2013-02-25T11:21:36.517 回答
0

这是我以前使用过的一种方法(嗯,它的一种变体)。

假设您go在 Car 上breakDown有某种通用方法(

public class Car {
    protected String engineNoise = null;

    public void go() {
        engineNoise = "vroom";
    }

    public void breakDown() {
        engineNoise = null;
    }

    public String getEngineNoise() {
        return engineNoise;
    }
}

public class Volkswagen extends Car {
    public void breakDown() {
        throw new UnsupportedOperationException();
    }
}

然后你可以定义一个测试如下:

public abstract class CarTest<T extends Car> {
    T car;

    @Before
    public void setUp() {
        car = createCar();
    }

    @Test
    public void testVroom() {
        car.go();
        assertThat( car.getEngineNoise(), is( "vroom" ) );
    }

    @Test
    public void testBreakDown() {
        car.breakDown();
        assertThat( car.getEngineNoise(), is( null ) );
    }

    protected abstract T createCar();
}

现在,由于Volkswagen需要在testBreakDown方法中做一些不同的事情——并且可能还有其他需要测试的方法——那么你可以使用以下VolkswagenTest.

public class VolkswagenTest extends CarTest<Volkswagen> {
    @Test(expected = UnsupportedOperationException.class)
    public void testBreakdown() {
        car.breakDown();
    }

    protected Volkswagen createCar() {
        return new Volkswagen();
    }
}

希望有帮助!

于 2013-02-23T15:16:17.827 回答
0

实际上Unit Test是指Method Test,当你要编写单元测试时,你必须考虑要编写和测试的方法的功能,然后创建用于测试的类和方法。通过在设计和编写代码时考虑这种方法,可能会创建类的层次结构或仅创建单个类或任何类型的其他设计。

但是当你必须像上面提到的那样使用现有设计时,最好的做法是使用InterfacesBase Classes依赖对象,因为这样你可以轻松地模拟或存根这些类。

于 2013-02-24T17:02:39.557 回答