小编Flo*_*ian的帖子

如何将微服务中的端到端测试包含在多个连续交付管道中?

我的团队开发了三个微服务.三者共同提供业务场景.他们与REST和RabbitMQ进行通信.看起来像Toby Clemson关于微服务测试的演讲.

每个微服务都有自己的连续交付管道.它们是交付,而不是部署管道,这意味着最终会有一个手动发布决策.

如何将业务场景(即所有微服务)的端到端测试纳入交付管道?

我的团队建议:

我们添加了一个共享的端到端阶段,该阶段部署了所有三个微服务并对它们运行端到端测试.每当其中一条管道到达此阶段时,它就会进行部署和测试.信号量确保管道一个接一个地通过阶段.失败会停止所有三个管道.

共享端到端阶段

对我而言,这似乎牺牲了微服务架构首先获得的所有独立性:

  • 端到端阶段是一个瓶颈.快速管道可以阻止缓慢的管道,因为它更频繁地保留端到端阶段,使其他人在可能进行测试之前等待.

  • 一个管道中的故障将阻止其他管道交付,也禁止他们运送紧急错误修复.

  • 该解决方案无法适应需要不同微服务组合的新业务场景.我们最终会得到一个连接所有微服务的超级阶段,或者每个业务场景都需要自己的新的端到端阶段.

  • 端到端阶段只显示了一个狭窄的结果,因为它只确认了微服务版本的一个精确组合.如果生产包含不同的版本,则不保证这也会起作用.

  • 该阶段也与最终的手动发布决策相冲突:如果构建通过端到端但我们决定不将其发布到生产中会怎么样?然后,生产将包含与端到端不同的微服务版本,从而导致扭曲的结果.

那么有什么更好的方法呢?

automated-tests ase end-to-end continuous-delivery microservices

8
推荐指数
1
解决办法
585
查看次数

@Autowired Spring @Component 和 @ConditionalOnProperty

我可以使用@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)

spring autowired featuretoggle

5
推荐指数
1
解决办法
1万
查看次数

我应该在哪里为 Spring 的 @Qualifier 注解定义常量?

Spring 的依赖注入允许使用注释区分同一接口的多个实现@Qualifier("<flavor>")。

例如,我们可以有:

public class Consumer {
  @Autowired("b") private SomeInterface dependency;
}

public interface SomeInterface { }

@Component @Qualifier("a")
public class VariantA implements SomeInterface { }

@Component @Qualifier("b")
public class VariantB implements SomeInterface { }
Run Code Online (Sandbox Code Playgroud)

这要求消费者和实现都使用相同的常量字符串来标识变体,在本例中为“a”和“b”。作为一名干净的编码员,我的第一个冲动是为这些字符串创建常量。

但我应该把它们放在哪里呢?

A、消费者

将它们放入 Consumer 中是不可能的,因为这会将依赖关系反转到非法方向,要求实现了解其消费者:

public class Consumer {
  public final static String VARIANT_B = "b";
  @Autowired(Consumer.VARIANT_B) private SomeInterface dependency;
}

@Component @Qualifier(Consumer.VARIANT_B)
public class VariantB implements SomeInterface { }
Run Code Online (Sandbox Code Playgroud)

B. 实施

将它们放入实现中似乎也不是重点,重新引入依赖注入首先想要删除的消费者知道实现依赖:

public class Consumer {
  @Autowired(VariantB.VARIANT_B) private SomeInterface dependency;
} …
Run Code Online (Sandbox Code Playgroud)

spring dependency-injection

5
推荐指数
1
解决办法
1439
查看次数

更新内部表中的列的最短表示法是什么?

我有一个 ABAP 内部表。结构化,具有多个列(例如 25 个)。名称和类型无关紧要。该表可能会变得非常大(例如 5,000 条记录)。

| A   | B   | ... |
| --- | --- | --- |
| 7   | X   | ... |
| 2   | CCC | ... |
| 42  | DD  | ... |
Run Code Online (Sandbox Code Playgroud)

现在我想将其中一列(例如 B)设置为特定的常量值(例如“Z”)。

执行此操作的最短、最快和最节省内存的方法是什么?

我最好的猜测是LOOP REFERENCE INTO. 这是非常有效的,因为它就地更改了表,而不会浪费新的内存。但它占用了三个语句,这让我想知道是否可以缩短:

LOOP AT lt_table REFERENCE INTO DATA(ls_row).
  ls_row->b = 'Z'.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

然后是VALUE运算符将其简化为一个语句,但效率不高,因为它会创建新的内存区域。对于大量列,它也会变得冗长,因为它们必须一一列出:

lt_table = VALUE #( FOR ls_row in lt_table ( a = ls_row-a
                                             b = 'Z' ) …
Run Code Online (Sandbox Code Playgroud)

abap internal-tables

4
推荐指数
1
解决办法
8122
查看次数

内联解引用方法返回参数

我见过几个 ABAP 标准方法,它们返回对数据的引用作为结果。 CL_ABAP_EXCEPTIONAL_VALUES=>GET_MAX_VALUE( )是其中一种方法。我的自然倾向是在一行中使用此方法,如下所示:

DATA lv_max_value TYPE i.
lv_max_value = CL_ABAP_EXCEPTIONAL_VALUES=>GET_MAX_VALUE( lv_max_value )->*.
Run Code Online (Sandbox Code Playgroud)

可悲的是,这不起作用,因为:

功能方法“GET_MAX_VALUE”的结果类型不是对象引用或接口引用。

手头的问题是:是否可以直接取消引用这些结果?

每当我确定结果是兼容的时,我宁愿避免取消引用的旧方法(存储引用,将其分配给字段符号,然后将其放入目标变量):

DATA lv_max_value TYPE i.
DATA ref TYPE REF TO data.
FIELD-SYMBOLS <field> TYPE any.
ref = CL_ABAP_EXCEPTIONAL_VALUES=>GET_MAX_VALUE( lv_max_value ).
ASSIGN ref->* TO <field>.
lv_max_value = <field>.
Run Code Online (Sandbox Code Playgroud)

这似乎是一个简单动作的大规模操作。

abap return-value dereference

3
推荐指数
1
解决办法
403
查看次数

我可以模拟具有自定义属性的系统吗?

我们正在使用目的地服务来配置到不同类型系统的连接。作为其中的一部分,我们使用“附加属性”部分来添加非标准属性,例如my.custom.property=123.

我们已经成功地使用 SAP Cloud SDKMockUtil编写了使用这些文件systems.yml并credentials.yml作为测试系统源的Spring 集成测试。

但是,我们找不到在那里创建条目的方法,该条目将提供具有自定义属性的测试系统,例如my.custom.property=123.

该erp部分仅接受 ERP 系统已知的属性,例如sapClient. 通用systems部分只接受绝对的基本属性名称、类型、uri 和代理。在任一部分添加未知属性都会导致运行时错误,因为模拟工具无法将未知属性解析为具有固定结构的数据类。

是否有另一种方法来模拟 Destination 允许我们包含非标准属性?

例如,DestinationAccessorMocker看起来很有希望,因为它似乎可以设置Destination接口的自定义实现,但我们无法弄清楚如何使用它。

sap-cloud-sdk

3
推荐指数
1
解决办法
62
查看次数

如何在 SAP UI5 代码中生成 UUID?

我知道如何在 node.js 中使用 npm 管理的库(例如uuid. 但是,在基于浏览器的 SAP UI5 JavaScript 代码中执行此操作的好方法是什么?

javascript uuid sapui5

3
推荐指数
1
解决办法
4658
查看次数