当前位置: 首页 > 知识库问答 >
问题:

通过日志语句来测试逻辑的流程是一个不好的做法吗?

谭池暝
2023-03-14

我有一个逻辑可以做这样的事情,我想测试一下:

public void doSomething(int num) {
  var list = service.method1(num);
  if (!list.isEmpty()) {
    // Flow 1
    LOG.info("List exists for {}", num);
    doAnotherThing(num);
  } else {
    // Flow 2
    LOG.info("No list found for {}", num);
  }
}

public void doAnotherThing(int num) {
  Optional<Foo> foo = anotherService.get(num);
  foo.ifPresentOrElse(
      foo -> {
        if (!foo.type().equals("no")) {
          // Flow 3
          anotherService.filter(foo.getFilter());
        } else {
          // Flow 4
          LOG.info("Foo is type {} - skipping", foo.type());
        }
      },
      // Flow 5
      () -> LOG.info("No foo found for {} - skipping", num));
}

对于每个将测试不同流的测试,我的第一个想法是使用Mockito.verify()来查看它们是否被调用。因此,为了测试流 1,我将验证另一个服务.get() 是在内部调用的。为了测试流 2,我会验证另一个服务.get() 从未被调用过。这本来没问题,除了流程 4 和流程 5。它们都会调用另一个服务.get() 一次,但不会调用其他任何内容。

因此,我创建了一个类来捕获测试中的日志。这将检查是否记录了某些日志,并且我将能够通过它看到它落在哪个流上。但我想问:这是一种不好的做法吗?我将把它与< code>verify()结合起来,这样< code>verify()可以到达的流将具有更高的优先级。

这样做的一个缺点是测试将依赖于日志消息的正确性,因此它会有点不稳定。为了解决这个问题,我想过将其中一些日志消息作为受保护的静态变量取出,测试也可以使用该变量,以便消息在方法和相应的测试之间保持不变。这样,将仅测试流。

如果答案是这是一个不好的实践,我将感谢任何关于如何测试流4和流5的提示。

共有1个答案

羊舌自强
2023-03-14

日志语句通常不是要测试的逻辑的一部分,而只是一个运维工具。应该调整它们以优化操作(不要太多的信息,不要太少),这样你就可以快速找出哪里出了问题,如果出了问题。确切的文本、日志级别和日志语句的数量不应被视为依赖于测试的稳定内容。否则,这将使更改日志记录概念变得更加困难。

 类似资料:
  • 有没有更简单的方法来完成我想要的?如果这是最好的方法,那么我做错了什么?

  • 问题内容: 缩进SQL语句的公认做法是什么?例如,考虑以下SQL语句: 应该如何缩进?非常感谢。 问题答案: 我喜欢将所有的“,”放在前面,这样,当SQL编辑器在X行出现错误时,我就永远不会搜索它们。 对于那些不使用这种类型的编写SQL语句的人来说,这是一个示例。两者都包含缺少逗号的错误。 在第一个示例中,我发现更容易,更快捷。希望本示例向您展示更多我的观点。

  • 多个action组装成块,可以根据不同条件执行一段语句 : tasks: - block: - yum: name={{ item }} state=installed with_items: - httpd - memcached - template: src=templa

  • 问题内容: 我正在开发一个显示图像并播放数据库声音的应用程序。我正在尝试确定是否使用单独的JFrame从GUI向数据库添加图像。 我只是想知道使用多个JFrame窗口是否是一种好习惯? 问题答案: 我只是想知道使用多个JFrames是否是一种好习惯? 坏习惯(坏习惯)。 用户不友好:用户只希望看到一个图标时,会在任务栏中看到多个图标。加上编码问题的副作用。 * 编写和维护代码的噩梦: * 一个模态

  • 语句和逻辑结构 #include <stdio.h> #include <stdlib.h> #include <Windows.h> //01.杂乱知识点: // 1.内存分配函数malloc(); // (1).分配单位:字节 // (2).分配方式: // 鲸吞+慢咽 // 2.内存分配注意事项: // 32位的单个进程一口气对多开辟2G

  • 标准循环 为了保持简洁,重复的任务可以用以下简写的方式: - name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2 如果你在变量文件中或者 ‘vars’ 区域定义了一组YAML列表,你也可以这样做: vars