关于功能标志/切换以及为什么要使用它们存在相当多的讨论,但大多数关于实现它们的讨论都围绕(网络或客户端)应用程序进行。如果您的产品/工件是 C 或 C++ 库,并且您的公共标头受标志影响,您将如何实现它们?
“天真的”做法并没有真正起作用:
/// Does something
/**
* Does something really cool
#ifdef FEATURE_FOO
* @param fooParam describe param for foo
#endif
*/
void doSomethingCool(
#ifdef FEATURE_FOO
int fooParam = 42
#endif
);
Run Code Online (Sandbox Code Playgroud)
您不会想运送这样的东西。
#define相同的功能标志来使事情正常工作在文件上运行预处理器来获取要分发的标头实际上并不起作用,因为这不仅会作用于功能标志,还会执行预处理器执行的所有其他操作。
没有这些缺陷的技术解决方案是什么?
功能切换非常适合新功能-在大多数情况下,功能应简单地被一些基于功能配置可见或不可见的UI容器包围。但是,如果一项新功能需要在现有代码库中进行大量更改,那么如何使用功能切换?我不能使用“复制和更改”,因为显然它比功能分支差得多-我不会遇到任何合并冲突。那么,满足这些要求的最佳实践是什么?
我工作的公司已经深入研究了功能切换配置键,这些键可以根据特定条件打开/关闭特定行为。马丁·福勒(Martin Fowler)实际上将它们称为业务切换(http://martinfowler.com/bliki/FeatureToggle.html)。
我们有许多客户都在使用相同的服务,但是每个客户都希望行为有所不同。更糟糕的是,许多人希望其用户的某些子组看到不同的行为。因此,我们使用业务切换。切换开关已成为具有if / else逻辑的意大利面球,偶尔会有意外的交互。
是否有任何设计模式可用于管理此类情况?
干杯!
我可以使用@AutowiredSpring 4.x@Component来基于featuretoggles.properties文件选择功能@ConditionalOnProperty的实现吗?
public class Controller {
@Autowired
private Feature feature;
}
@Component
@ConditionalOnProperty(name = "b", havingValue = "off")
public class A implements Feature {
}
@Component
@ConditionalOnProperty(name = "b", havingValue = "on")
public class B implements Feature {
}
@Configuration
@PropertySource("classpath:featuretoggles.properties")
public class SomeRandomConfig {
}
Run Code Online (Sandbox Code Playgroud)
使用src/main/resources/featuretoggles.properties文件:
b = on
Run Code Online (Sandbox Code Playgroud)
(切换开关“b”的名称和类“B”的名称匹配是巧合;我的目标不是让它们相等,切换开关可以有任何名称。)
feature这无法在 中Controller自动装配UnsatisfiedDependencyException,表示“没有可用的‘Feature’类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean”。
我知道我可以通过根据属性@Configuration选择 a 的类来实现这一点。@Bean但是,当我这样做时,每次添加功能切换时都必须添加一个新的配置类,并且这些配置类将非常相似:
@Configuration …Run Code Online (Sandbox Code Playgroud) 我需要在当前项目中实现功能切换。我不知道如何从头开始在Java中实现它。
我已经阅读了与该主题相关的各种文章中关于功能切换的理论,但是我还没有看到针对初学者详细描述此功能的实现教程或文档。
使用 .NET Core,在 Startup.cs 中,您可以访问 IHostingEnvironment,您可以从中获取 EnvironmentName,它对应于在服务器上设置的 ASPNETCORE_ENVIRONMENT 环境变量的值。这对于打开/关闭各种功能以及使用特定于环境的配置非常有用。但是对于一个全是 React.JS 的前端,有没有办法向下传递这个值,以便前端也知道它的环境?我可以想到一些可能的方法来完成,但它们看起来有点笨拙。这方面的最佳做法是什么?
提前致谢!
我们有一些使用 selenium web 驱动程序的自动化测试,它们很棒,并且提供了一个非常好的回归包。
问题是现在我们的代码中有功能切换。所以我需要说忽略这些测试,除非该功能切换被打开/关闭。我找不到任何真正在 Google 上搜索的东西。
理想情况下,我不希望在功能测试的顶部使用“if”语句,但看起来它将成为主要方式。我最初的想法是在哪里创建自定义属性
public class IsFeatureFlagTurnedOn : Attribute
{
public IsFeatureFlagTurnedOn(string featureToggleName)
{
FeatureToggleName = featureToggleName;
}
public string FeatureToggleName {get;}
}
public class MyTests
{
[TestMethod]
[IsFeatureFlagTurnedOn("MyFeature1")]
public void ItShould()
{
// only run if MyFeature1 is turned on
}
}
Run Code Online (Sandbox Code Playgroud)
我有些需要挂钩到 MSTest 管道并说明是否存在此属性并且 MyFeature1 的逻辑已关闭,然后不要运行此测试 - 查看动态添加 [Ignore] 但没有运气。
这是通过 VSTS 运行的,我可以使用 [TestCategories] 但我必须不断更新我不想打开/关闭的功能的管道。
任何帮助或建议都会很棒!
使用功能切换时如何进行测试?您希望您的开发计算机尽可能接近生产。从我观看的视频来看,功能切换的实现方式允许某些人“使用”该功能(即,0 到 100% 的用户,或选定的用户等)。
为了正确地进行持续集成,在进行测试时,您是否必须使用与生产服务器相同的功能切换设置?或者更好的是,如果该功能未在生产中关闭,请确保在构建管道中运行自动化测试时该功能已开启?您最终是在测试代码中放置功能切换,还是在新文件中编写测试?新功能何时是系统测试必须进行的流程中的强制性步骤?
.net ×1
architecture ×1
asp.net-core ×1
autowired ×1
c ×1
c# ×1
c++ ×1
java ×1
javascript ×1
mstest ×1
reactjs ×1
spring ×1
testing ×1
unit-testing ×1