自动化测试中,如何同时忽略日志语句?
发布于 7 年前 作者 sunfeng90 4036 次浏览 来自 问答

亲们,我在做自动化测试/单元测试。有一个小问题请教一下大家。例如我要测试a.js,而我在b.js中写测试用例。我想一次性忽略a.js中的日志语句,但是又不能手动在a.js中添加类似:/istanbul ignore next/的语句。意思就是a中日志语句不计入测试覆盖率。如何解决啊?

19 回复

可以通过环境变量来区分运行时环境,比如 env=testing 时日志语句不工作。这样做的前提是要日志语句针对环境变量做些支持。

logger level = silent 对于自己 console.log 的使用楼上的方法, NODE_ENV=testing | unittest

一般来说,日志语句都会被执行到的。根据楼主的描述,我猜测是几种情况:

  1. try catch 里面的错误日志,这类日志如果没覆盖到,说明你的测试用例不够全,要补上。
  2. 业务代码里面的日志是 if (logger.enabled) logger.info('xxx') 这样的, 这种应该在业务里面不要写 if 而是通过全局的 logger level 之类的配置解决。

@atian25

1、如果是查询数据库错误,如何构造呢?一般构造不出来测试用例啊

@atian25 好吧,谢谢!

@sunfeng90 没测到就是没测到,为了覆盖率,把对应的错误处理环节去 ignore 了,是有风险的,你就那么确认错误处理的正确性么?虽然里面可能只有一句日志输出,但是万一遗漏了资源回收什么的呢?

@atian25 好吧!我在研究sinon,发现自己弄错了。目前出现的问题:断言还依赖服务器的返回值,无法构造假的值。

assert 和 mock 是两回事。

@atian25 我出现的问题是:断言的值还依赖服务器的返回值;无法构造假的用例。数据库出错的用例无法构造。我在研究,用mock来解决。

@atian25 你是用Sinon实现mock的嘛?

@atian25 其实我真实想要的是模拟其他函数的输出,不关注是否被调用或者被调用的次数。我现在出现问题的是:无法构造查询数据库出错的用例,最后导致:if(err) return callback(err);没有被覆盖。

你应该把能导致该分支的前置逻辑给 mock 了。

@atian25 发现你的项目都不错!我都fork了,正在研究你的spy.

@atian25 可以加你微信吗?想请教你在Spy框架里遇到的问题

spy 不是我写的, 你直接在它的 issue 交流即可

@atian25 研究了spy,我自己跑了一遍,搞懂代码了!谢谢

回到顶部