【问题标题】:Micrometer Unit Test Java千分尺单元测试Java
【发布时间】:2022-10-24 22:22:07
【问题描述】:

我创建了一个 Micrometer 类,在其中创建和递增计数器。如何为公共方法编写单元测试用例并避免将事件注册或发送到 micrometer。

public class MicroMeter {
private static final MeterRegistry registry = Metrics.globalRegistry;
private Counter createCounter(final String meterName, Map<String, String> mp) {

    List<Tag> tags = new ArrayList<>();
    for (Map.Entry<String, String> entry : mp.entrySet()) {
        tags.add(Tag.of(entry.getKey(), entry.getValue()));
    }
    return Counter
            .builder(meterName)
            .tags(tags)
            .register(registry);
}

private void incrementCounter(Counter counter)  {
        counter.increment();
}

public static void createCounterAndIncrement(final String meterName, Map<String, String> mp){
    MicroMeter microMeter = new MicroMeter();
    Counter counter = microMeter.createCounter(meterName, dimensions);
    microMeter.incrementCounter(counter);
}

}

【问题讨论】:

    标签: java spring spring-boot micrometer spring-micrometer


    【解决方案1】:

    您可以简单地传入一个内存计量注册表以进行单元测试。我不记得类名了,但是 Micrometer 有一个。 您的代码需要设计为接受注册表,而不是创建它。

    因为 Micrometer 的全部目的是与您选择的后端(如 Graphite)集成,所以纯粹从单元测试中获得的好处并不多。除了创建指标之外,如果您的后端不支持标签,您还需要检查这些指标是否已线性化,如果启用了这些,您还需要检查客户端直方图等其他内容。 我自己做并推荐的是集成测试。以下是一般步骤:

    1. 创建内存中的仪表注册表;注册表应该是一个 bean,而不是静态变量,您可以很容易地替换它进行测试。
    2. 为您的后端模拟发件人,如果我没记错名称,例如 GraphiteSender,并使用模拟来验证正在发送的指标。

    【讨论】:

      【解决方案2】:

      为这种情况编写测试的一种方法是利用SimpleMeterRegistry,将其添加到globalRegistry,获取Counter,然后测试预期的行为。

      示例 sn-p:

      private MeterRegistry meterRegistry;
      
      @BeforeEach
      void setUp() {
        meterRegistry = new SimpleMeterRegistry();
        Metrics.globalRegistry.add(meterRegistry);
      }
      
      @AfterEach
      void tearDown() {
        meterRegistry.clear();
        Metrics.globalRegistry.clear();
      }
      
      @Test
      void testCreateCounterAndIncrement() {
        // When
        MicroMeter.createCounterAndIncrement("meterName", Map.of("key", "val"));
      
        // Then
        var counter = meterRegistry.find("meterName").counter();
        then(counter).isNotNull();
        then(counter.count()).isEqualTo(1);
        then(counter.getId().getTag("key")).isEqualTo("val");
       }
      

      【讨论】:

        猜你喜欢
        • 2019-04-30
        • 1970-01-01
        • 2019-08-22
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多