Junit的。几个测试行为没有代码重复

时间:2016-11-22 12:44:10

标签: java junit qa

目前我正在为小公司开发测试框架,并且遇到了这个问题:

服务可以通过以下方式与彼此交流:

  1. 使用直接请求(服务< - >服务)
  2. 通过公共网关(服务< - >网关< - >服务)
  3. 我有一些测试,只覆盖第一个变体。

    我想要的是以某种方式覆盖第二个变体而没有复制和粘贴第一个的代码。所有差异仅在第一步(连接建立)。 我尝试使用参数化,但看起来,这不是我需要的。

    UPD:

    第一个变体的代码示例:

    Clients clients = new Clients( configLoader.getProperty("env.servicename.host"), Integer.parseInt(configLoader.getProperty("env.servicename.port")));

    第二个变体的代码示例:

    Clients clients = new Clients( configLoader.getProperty("env.gateway.host"), Integer.parseInt(configLoader.getProperty("env.gateway.port")), configLoader.getProperty("env.gateway.user"), configLoader.getProperty("env.gateway.password"));

2 个答案:

答案 0 :(得分:0)

我需要一些代码示例来为您提供更多详细信息,但这里的想法是您针对接口进行编程,然后您将不需要重复的代码。

假设您的服务和Gateway组件实现相同的界面。您可以在测试中使用两种不同的实现,而无需更改代码。也就是说,如果输出仍然相同。

另一种选择是编写一个可以测试的小型适配器类,它可以调用服务或网关组件。如果调用两个不同组件的实现非常不同,那么(再次)您可以创建两个适配器实现实现的接口。让你的测试变得干净整洁。

希望这能让您对如何思考这些事情有所了解。

答案 1 :(得分:0)

正如我在评论中提到的,Burst似乎符合您的需求。

首先,你要定义一个带有参数化行为的枚举,类似于:

enum CommunicationStyle {
    DIRECT() {
        @Override
        public Clients clients(Object configLoader) {
            return new Clients(configLoader.getProperty("someprop"));
        }
    },
    SERVICE() {
        @Override
        public Clients clients(Object configLoader) {
            return new Clients(configLoader.getProperty("otherprop"));
        }
    };

    public abstract Clients clients();
}

在测试中,您将枚举CommunicationStyle指定为参数。这指示Burst为每个枚举元素运行一次测试。在这种情况下,每个测试都会运行两次,一次使用CommunicationStyle.DIRECT,一次使用CommunicationStyle.SERVICE

@RunWith(BurstJUnit4.class)
public class SomeParameterizedTest {

    @Test
    public void someTest(CommunicationStyle style) throws Exception {
        Object configLoader = ...
        Clients = style.clients(configLoader);

        // more logic
    }
}

然后,您可以使用枚举值来获取参数化行为,例如特制的Clients实例。