《Erlang Test》
1 | 前言:格物致知 |
目录:
- common_test使用笔记
- eunit使用笔记
一、common_test
(1)初识common_test
1.common_test 简介
1
2
3
4
5
6
7
8
9Automated execution of test suites (sets of test cases)
自动执行测试的用例
Logging of events during execution
在执行期间记录事件
HTML presentation of test suite results
HTML presentation of test suite code
Support functions for test suite authors
Step-by-step execution of test cases2.common_test 基本用法
一些通用的概念1
2
3必须导出 ----- all/0
命名规则 ----- *_SUITE.erl
推荐导入 ----- -include(ct.hrl)
测试规范语法(test.spec)
1 | {Key, value} |
config写法
1 | 写: |
启动
1 | Command line内 |
- 引用
1.更多规范阅读官方文档
地址 https://erlang.org/doc/apps/common_test/run_test_chapter.html
(2)Common_test实践
通用导出:
1
2
3
4
5
6
7
8
9all()->
[
%%假设写了一个背包模块需要测试
t_bag_function/1 %%必须给一个参数用来装Config
].
%%全局的一个CTH的配置,后面会讲CTH的作用
suite() ->
[{ct_hooks, [cth_surefire]}, {timetrap, {seconds, 30}}].1.testcase模式(这里我理解为单例,一个test进程做事
导出
1
2
3
4
5
6
7
8init_per_testcase(TestCase, Config) ->
Link = LinkSupport:start_link(),
[{link, Link} | Config].
end_per_testcase(TestCase, Config) ->
ok.
%%可以在这里做一些事情,比如说创建连接t_bag_function/1的函数
1
2
3
4
5t_bag_function(Config) ->
Link = ?config(link, Config),
R = #get_bag_item{},
#bag_item{} = LinkSupport:sendandwait(Clinet ,R).
%%阻塞在接受消息,会有自己可以做Socket的超时限制,CTH也有超时限制,每个用例不超过30s
2.group模式
我理解为,一组行为组模式
- 导出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16groups() ->
[
{groupname, prop, testcase}
].
%% testcases = [testcase], testcase = 单例|group
%% prop = [repeat, mode]
%% mode = 并发|顺序|随机, repeat有很多,可以看看官方文档的返回值
init_per_group(_Groupname, Config) ->
Link = LinkSupport:start_link(),
[{link, Link} | Config].
end_per_group(_Groupname, _Config) ->
ok. - 遇到的问题
- 假设把创建连接,放到per_group中,等创建testcase再拿出来的时候会报错,假设连接时TCP,因为此时的group进程会挂掉,Socket Controlling是group 然后当testcase进程需要访问Socket的时候,会报错。
- 每个组内的用例,都是独立的,都是独立的进程,每次启动都只会Goup传过来的Conifg(待考就,是否有配置可调,但是我没测出来可以)
- 实现t_bag_function/1的函数
更多方法function参考
地址 https://erlang.org/doc/man/common_test.html
–总结–
假设需要多例测试的话,在group内用test_case即可,然后再每个test_case的用例方法抽出来,需要用哪个就调用哪个
(3)Common_test拓展
1.CTH
待补充
二、eunit
初始Eunit
1 | 官方文档提到,参考了很多oop unit的思想, |
Eunit实践
step1:包含库
1 | -include_lib("eunit/include/eunit.hrl"). |
step2:导出test方法
1 | 1.官方文档说到任何匹配..._test() or ..._test_的函数,全部都会自动的被认为是导出的, |
step3:一个简单的例子
1 | -module(fib). |
- 关于宏定义的使用
1
2
3
4
5
6?assert(表达式) %%判断返回值是否是true,不是就抛错
?_test(表达式) %%自动添加行号当测试进行的时候,增加可读性
?_assertException(表达式) %%
%%定义不要测试的宏
-define(NOTEST, 1).
更多宏的使用请参考官方文档: https://erlang.org/doc/apps/eunit/chapter.html#Simple_test_objects