测试
使用rebar3进行测试
Rebar3拥有内建的eunit和ct(common_test)测试工具,通过遵循一些约定,您可以使用一个Rebar3命令运行测试套件。
通用测试框架 Common Test
运行common_test套件:
$ rebar3 ct
Rebar3会查找您所有应用的test目录并编译和运行任何名字未*_SUITE.erl的源文件。与常规源目录不同,默认情况下,测试模块的编译将不是递归的,以避免数据目录中的文件出现问题。但是,可以使用正确的编译选项手动改变此行为。
只运行指定的测试:
$ rebar3 ct --suite=test/first_SUITE,test/second_SUITE
Rebar3拥有内建的common_test,支持大部分的测试组件和common_test选项。如果您的测试套件需要使用测试规范或涵盖规范,请注意Rebar3会为每个配置文件保留单独的构建工件,因此您可能需要调整路径以指向_build下相关配置文件目录中的模块和目录,以使其按预期运行。如果您需要使用一个rebar3不支持的common_test选项,以下命令可用于运行指定路径下的rebar3生成的已编译beam文件的通用测试(common_test)
$ ct_run -pa `rebar3 path` ...
ct命令默认使用test配置运行。详见Profiles
想要了解所有可用选项和用法请看 Commands,或者:
$ rebar3 help ct
EUnit
运行eunit测试非常简单:
$ rebar3 eunit
rebar3会为所有模块定义宏{d, TEST, true}
和{d, EUNIT, true}
并编译,因此您可以将测试代码藏在条件编译里面:
-ifdef(TEST).
%% 测试代码
-endif.
%% 或者
-ifdef(EUNIT).
%% 测试代码
-endif.
它还会自动编译应用目录所在的test路径下的源文件(如果存在),然后通过调用eunit:test([{application, App}])
为每个应用运行测试。
如果您想要在 eunit:test/1
传入自己的参数,您可以在rebar.config中使用eunit_opts键
覆盖范围
所有内置测试工具的测试运行都将生成掩护数据。rebar3 cover稍后再调用将通过合并所有单个报告来生成常规代码覆盖率报告:
$ rebar3 ct --dir test/suites1 --cover --cover_export_name=suites1
===> Running Common Test suites...
...
$ rebar3 ct --dir test/suites2 --cover --cover_export_name=suites2
===> Running Common Test suites...
...
$ ls _build/test/cover
cover.log suite1.coverdata suite2.coverdata
$ rebar3 cover --verbose
===> Performing cover analysis...
|----------------------------|------------|
| module | coverage |
|----------------------------|------------|
| .... | Y% |
|----------------------------|------------|
| total | X% |
|----------------------------|------------|
coverage calculated from:
_build/test/cover/suites1.coverdata
_build/test/cover/suites2.coverdata
cover summary written to: _build/test/cover/index.html