从一个地方控制Togglz

时间:2017-02-16 11:36:06

标签: java spring spring-mvc togglz featuretoggle

我们目前正在尝试在Spring-MVC中实现Togglz库。

我们目前通过以下方式管理来自MyFeatures.java文件的代码中的切换:

import org.togglz.core.Feature;
import org.togglz.core.annotation.EnabledByDefault;
import org.togglz.core.annotation.Label;
import org.togglz.core.context.FeatureContext;

public enum MyFeatures implements Feature {

    @Label("A Feature")
    MY_FEATURE;

    public boolean isActive() {
    return FeatureContext.getFeatureManager().isActive(this);
    }
}

然后在我们的实际课程中:

if (MyFeatures.MY_FEATURE.isActive()) {
    // some code...
}

这很有效但我们在测试中存在缺陷,我们会执行以下操作:

@Rule
public TogglzRule togglzRule = TogglzRule.allDisabled(MyFeatures.class);

// some tests, then:

    if (MyFeatures.MY_FEATURE.isActive()) {
        // some feature dependent test...
    }

这里的问题是我们MyFeature.java中的切换默认为禁用,并从我们的UI或此MyFeatures.java文件中打开/关闭。但是......我们在测试中的切换默认为启用并使用以下任一行打开/关闭:

@Rule
    public TogglzRule togglzRule = TogglzRule.allDisabled(MyFeatures.class);

或在每次测试中单独进行。

这至少有两个地方我们必须切换我们的功能,如果我们有更多的测试使用这些功能可能更多,所以我的问题是:

是否可以从一个地方控制所有Togglz功能切换,无论它们是在代码还是测试中?

1 个答案:

答案 0 :(得分:1)

  

这里的问题是我们在MyFeature.java中的切换默认为禁用,并从我们的UI或此MyFeatures.java文件中打开/关闭。

更改此文件或UI中的功能状态会影响生产环境中的应用程序行为(从而影响可能的用户)。

  

但是......我们在测试中的切换默认为启用并使用以下任一行打开/关闭:

更改测试中的功能状态会影响测试下的应用程序行为。

  

这至少有两个地方我们必须切断我们的功能,如果我们有更多的测试使用这些功能可能更多

你所问的是有争议的,因为如果存在这种可能性,它将影响两种环境(测试和生产)。这一事实将导致以下结果:

  • 当您禁用某些功能时,测试开始失败,因为他们依赖此功能并尝试对其进行测试
  • 然后您启用此功能,测试正在通过,但现在用户可能会看到尚未准备好的功能

因此,为了这个目的存在这种分离,并且从2个不同的地方管理功能状态实际上是一个功能而不是错误。

我听说过另一个想法,在大多数情况下,你不应该在禁用功能时测试这些情况,因为这种状态应该是暂时的,并且不值得为所有可能的情况进行测试。