今天学习了下Erlang单元测试,发现非常有用,现在做个总结:
我们先看一个例子(吐槽下Iteye的erlang代码高亮):
这个module负责计算1到N的和,现在我们如何确认这个module功能的正确性呢?
方法1:你可以再shell终端下,不断输入测试参数,然后验证程序输出结果,这种方法比较简单,而且可能也是每个人的首选方式,但是当我们日后不断对module进行修改,为了能够保证功能的正确性,我们又必须把以前的测试数据再输入一遍,所以这种方式不可持续发展;
方法2:编写单元测试,“一劳永逸”(下次改完module代码,我们只要跑下单元测试即可)
单元测试代码:
需要注意的几点:
1.单元测试的module名 = 需要测试的module名 + "_tests"后缀(或者_test_后缀),譬如这里我需要测试diaocow.erl,那么我的单元测试代码就是diaocow_tests.erl;
2.测试方法名需要以"_test"为后缀;
3.单元测试需要引入头文件:-include_lib("eunit/include/eunit.hrl")
现在我们来运行单元测试(需要先编译)
其中:
1.erlc 是编译命令,erlc *.erl表示编译当前目录下所有erlang源文件;
2.eunit:test(Module) 执行某个module的单元测试
到目前似乎一切都OK了,但是你有没有发现代码目录实在是太乱了,源文件,单元测试文件,字节码文件都放在一个目录下,现在我们就按照业界标准来把它们分下类:
src |
存放程序源代码文件 |
ebin |
存放编译后的字节码文件 |
test |
存放单元测试源代码文件 |
如下图
现在我们执行编译:
-o 参数用来指定编译后的字节码存放目录(这里是ebin)
现在我们在重新运行下单元测试:
-pa参数用来指定执行文件(.beam)目录
为了更方便的创建/编译erlang工程项目,我自己写了两个简单的脚本:
1.erlang工程创建脚本
2.erlang工程编译脚本
为了能够更方便的使用这两个脚本,我们在.bashrc文件中配置alias(添加快捷键)
我们看下脚本执行效果:
1.创建erlang项目
2.编译erlang项目(若编译正常,则自动进入erl shell)
其实上面脚本所提供的功能,rebar都提供了,而且更加强大完善(搜索 erlang rebar)
关于erlang的单元测试,我就说到这里,更详细的官方文档,请看这里:
http://www.erlang.org/doc/apps/eunit/chapter.html#id61195