今天学习了下Erlang单元测试,发现非常有用,现在做个总结:
我们先看一个例子(吐槽下Iteye的erlang代码高亮):
[img]http://dl.iteye.com/upload/attachment/0078/3516/1320aa76-4c87-3277-a8b2-00885978ed7d.jpg[/img]
这个module负责计算1到N的和,现在我们如何确认这个module功能的正确性呢?
方法1:你可以再shell终端下,不断输入测试参数,然后验证程序输出结果,这种方法比较简单,而且可能也是每个人的首选方式,但是当我们日后不断对module进行修改,为了能够保证功能的正确性,我们又必须把以前的测试数据再输入一遍,所以这种方式不可持续发展;
方法2:编写单元测试,“一劳永逸”(下次改完module代码,我们只要跑下单元测试即可)
单元测试代码:
[img]http://dl.iteye.com/upload/attachment/0078/3518/4163fce0-3407-3a3a-9900-d0bf9244e55c.jpg[/img]
[b]需要注意的几点:[/b]
1.单元测试的module名 = 需要测试的module名 + "_tests"后缀(或者_test_后缀),譬如这里我需要测试diaocow.erl,那么我的单元测试代码就是diaocow_tests.erl;
2.测试方法名需要以"_test"为后缀;
3.单元测试需要引入头文件:-include_lib("eunit/include/eunit.hrl")
现在我们来运行单元测试(需要先编译)
[img]http://dl.iteye.com/upload/attachment/0078/3522/8e3dc2b8-8535-3a5d-9caf-ebd5cce4717e.jpg[/img]
其中:
1.erlc 是编译命令,erlc *.erl表示编译当前目录下所有erlang源文件;
2.eunit:test(Module) 执行某个module的单元测试
到目前似乎一切都OK了,但是你有没有发现代码目录实在是太乱了,源文件,单元测试文件,字节码文件都放在一个目录下,现在我们就按照业界标准来把它们分下类:
[table]
|src| 存放程序源代码文件|
|ebin| 存放编译后的字节码文件|
|test| 存放单元测试源代码文件|
[/table]
如下图
[img]http://dl.iteye.com/upload/attachment/0078/3524/f395a849-ee3c-3eb6-be2e-1a139e04639b.jpg[/img]
现在我们执行编译:
[img]http://dl.iteye.com/upload/attachment/0078/3526/7e7fe32c-4f9f-3cc0-9fa3-eaa88fc7f12b.jpg[/img]
-o 参数用来指定编译后的字节码存放目录(这里是ebin)
现在我们在重新运行下单元测试:
[img]http://dl.iteye.com/upload/attachment/0078/3528/1c0285a7-8a9c-36ed-9476-130833a968f3.jpg[/img]
-pa参数用来指定执行文件(.beam)目录
为了更方便的创建/编译erlang工程项目,我自己写了两个简单的脚本:
1.erlang工程创建脚本
[img]http://dl.iteye.com/upload/attachment/0078/3530/53308e43-162f-3561-a873-bda2f943a95d.jpg[/img]
2.erlang工程编译脚本
[img]http://dl.iteye.com/upload/attachment/0078/4211/162604f9-ea93-32e3-b43c-48f2ed6e8ded.jpg[/img]
为了能够更方便的使用这两个脚本,我们在.bashrc文件中配置alias(添加快捷键)
[img]http://dl.iteye.com/upload/attachment/0078/3534/491a389f-17fa-36a8-80d9-1d2b4aca1df9.jpg[/img]
我们看下脚本执行效果:
1.创建erlang项目
[img]http://dl.iteye.com/upload/attachment/0078/3536/94b5f0c1-17ca-33e2-964d-84ec708720f6.jpg[/img]
2.编译erlang项目(若编译正常,则自动进入erl shell)
[img]http://dl.iteye.com/upload/attachment/0078/3538/84f3fd1d-0e94-3383-aea9-32e6d82bce99.jpg[/img]
其实上面脚本所提供的功能,rebar都提供了,而且更加强大完善(搜索 erlang rebar)
关于erlang的单元测试,我就说到这里,更详细的官方文档,请看这里:[url]http://www.erlang.org/doc/apps/eunit/chapter.html#id61195[/url]
我们先看一个例子(吐槽下Iteye的erlang代码高亮):
[img]http://dl.iteye.com/upload/attachment/0078/3516/1320aa76-4c87-3277-a8b2-00885978ed7d.jpg[/img]
这个module负责计算1到N的和,现在我们如何确认这个module功能的正确性呢?
方法1:你可以再shell终端下,不断输入测试参数,然后验证程序输出结果,这种方法比较简单,而且可能也是每个人的首选方式,但是当我们日后不断对module进行修改,为了能够保证功能的正确性,我们又必须把以前的测试数据再输入一遍,所以这种方式不可持续发展;
方法2:编写单元测试,“一劳永逸”(下次改完module代码,我们只要跑下单元测试即可)
单元测试代码:
[img]http://dl.iteye.com/upload/attachment/0078/3518/4163fce0-3407-3a3a-9900-d0bf9244e55c.jpg[/img]
[b]需要注意的几点:[/b]
1.单元测试的module名 = 需要测试的module名 + "_tests"后缀(或者_test_后缀),譬如这里我需要测试diaocow.erl,那么我的单元测试代码就是diaocow_tests.erl;
2.测试方法名需要以"_test"为后缀;
3.单元测试需要引入头文件:-include_lib("eunit/include/eunit.hrl")
现在我们来运行单元测试(需要先编译)
[img]http://dl.iteye.com/upload/attachment/0078/3522/8e3dc2b8-8535-3a5d-9caf-ebd5cce4717e.jpg[/img]
其中:
1.erlc 是编译命令,erlc *.erl表示编译当前目录下所有erlang源文件;
2.eunit:test(Module) 执行某个module的单元测试
到目前似乎一切都OK了,但是你有没有发现代码目录实在是太乱了,源文件,单元测试文件,字节码文件都放在一个目录下,现在我们就按照业界标准来把它们分下类:
[table]
|src| 存放程序源代码文件|
|ebin| 存放编译后的字节码文件|
|test| 存放单元测试源代码文件|
[/table]
如下图
[img]http://dl.iteye.com/upload/attachment/0078/3524/f395a849-ee3c-3eb6-be2e-1a139e04639b.jpg[/img]
现在我们执行编译:
[img]http://dl.iteye.com/upload/attachment/0078/3526/7e7fe32c-4f9f-3cc0-9fa3-eaa88fc7f12b.jpg[/img]
-o 参数用来指定编译后的字节码存放目录(这里是ebin)
现在我们在重新运行下单元测试:
[img]http://dl.iteye.com/upload/attachment/0078/3528/1c0285a7-8a9c-36ed-9476-130833a968f3.jpg[/img]
-pa参数用来指定执行文件(.beam)目录
为了更方便的创建/编译erlang工程项目,我自己写了两个简单的脚本:
1.erlang工程创建脚本
[img]http://dl.iteye.com/upload/attachment/0078/3530/53308e43-162f-3561-a873-bda2f943a95d.jpg[/img]
2.erlang工程编译脚本
[img]http://dl.iteye.com/upload/attachment/0078/4211/162604f9-ea93-32e3-b43c-48f2ed6e8ded.jpg[/img]
为了能够更方便的使用这两个脚本,我们在.bashrc文件中配置alias(添加快捷键)
[img]http://dl.iteye.com/upload/attachment/0078/3534/491a389f-17fa-36a8-80d9-1d2b4aca1df9.jpg[/img]
我们看下脚本执行效果:
1.创建erlang项目
[img]http://dl.iteye.com/upload/attachment/0078/3536/94b5f0c1-17ca-33e2-964d-84ec708720f6.jpg[/img]
2.编译erlang项目(若编译正常,则自动进入erl shell)
[img]http://dl.iteye.com/upload/attachment/0078/3538/84f3fd1d-0e94-3383-aea9-32e6d82bce99.jpg[/img]
其实上面脚本所提供的功能,rebar都提供了,而且更加强大完善(搜索 erlang rebar)
关于erlang的单元测试,我就说到这里,更详细的官方文档,请看这里:[url]http://www.erlang.org/doc/apps/eunit/chapter.html#id61195[/url]