测试

使用rebar3进行测试

Rebar3拥有内建的eunit和ct(common_test)测试工具,通过遵循一些约定,您可以使用一个Rebar3命令运行测试套件。

通用测试框架 Common Test

运行common_test套件:

  1. $ rebar3 ct

Rebar3会查找您所有应用的test目录并编译和运行任何名字未*_SUITE.erl的源文件。与常规源目录不同,默认情况下,测试模块的编译将不是递归的,以避免数据目录中的文件出现问题。但是,可以使用正确的编译选项手动改变此行为

只运行指定的测试:

  1. $ rebar3 ct --suite=test/first_SUITE,test/second_SUITE

Rebar3拥有内建的common_test,支持大部分的测试组件和common_test选项。如果您的测试套件需要使用测试规范或涵盖规范,请注意Rebar3会为每个配置文件保留单独的构建工件,因此您可能需要调整路径以指向_build下相关配置文件目录中的模块和目录,以使其按预期运行。如果您需要使用一个rebar3不支持的common_test选项,以下命令可用于运行指定路径下的rebar3生成的已编译beam文件的通用测试(common_test)

  1. $ ct_run -pa `rebar3 path` ...

ct命令默认使用test配置运行。详见Profiles

想要了解所有可用选项和用法请看 Commands,或者:

  1. $ rebar3 help ct

EUnit

运行eunit测试非常简单:

  1. $ rebar3 eunit

rebar3会为所有模块定义宏{d, TEST, true}{d, EUNIT, true}并编译,因此您可以将测试代码藏在条件编译里面:

  1. -ifdef(TEST).
  2. %% 测试代码
  3. -endif.
  4. %% 或者
  5. -ifdef(EUNIT).
  6. %% 测试代码
  7. -endif.

它还会自动编译应用目录所在的test路径下的源文件(如果存在),然后通过调用eunit:test([{application, App}])为每个应用运行测试。

如果您想要在 eunit:test/1传入自己的参数,您可以在rebar.config中使用eunit_opts键

覆盖范围

所有内置测试工具的测试运行都将生成掩护数据。rebar3 cover稍后再调用将通过合并所有单个报告来生成常规代码覆盖率报告:

  1. $ rebar3 ct --dir test/suites1 --cover --cover_export_name=suites1
  2. ===> Running Common Test suites...
  3. ...
  4. $ rebar3 ct --dir test/suites2 --cover --cover_export_name=suites2
  5. ===> Running Common Test suites...
  6. ...
  7. $ ls _build/test/cover
  8. cover.log suite1.coverdata suite2.coverdata
  9. $ rebar3 cover --verbose
  10. ===> Performing cover analysis...
  11. |----------------------------|------------|
  12. | module | coverage |
  13. |----------------------------|------------|
  14. | .... | Y% |
  15. |----------------------------|------------|
  16. | total | X% |
  17. |----------------------------|------------|
  18. coverage calculated from:
  19. _build/test/cover/suites1.coverdata
  20. _build/test/cover/suites2.coverdata
  21. cover summary written to: _build/test/cover/index.html