`
litaocheng
  • 浏览: 337726 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用EUnit进行单元测试

阅读更多
为了写一个好的产品,必定离不开完善的测试。

最近开始筹划项目,因此单元测试必不可少,一定要在开始的时候把测试做好,从下到上才能让产品更加坚固。

我们选择使用EUnit进行单元测试。使用Eunit的好处:减少代码的修改;提高开发速度;有利于接口与实现分离;有利于系统集成;还有测试本身可以作为一种文档。

1,首次从http://support.process-one.net/doc/display/CONTRIBS/EUnit 获取对应的SVN checkout路径,http://svn.process-one.net/contribs/trunk/eunit,通过svn进行下载。

2,将整个eunit目录放到你的erlang安装目录下的lib目录中。也可以使用通过code:add_path/1或者其他编译选项指明eunit的路径,但是不是很方便。

3,在你的module中添加: -include_lib("eunit/include/eunit.hrl"). 这样就引入了eunit的头文件,此时你的module具有了下面的特性:自动的将以"_test"结尾的函数作为测试函数;为你的module添加并导出了test/0函数;为你提供了丰富的test macro。(自动导出test函数,是通过compile指示符的parse_transform选项进行处理)

此时,我们的module已经具有了eunit赋予的一切权利。注意你从svn下载的代码,没有进行编译,你需要进行编译生成beam文件。由于本人是在windows下工作,编译不是很方便,所以我就直接从这里下载了eunit的beam文件,放到eunit/ebin/目录下。

在我们要测试的module中我们加入一个函数:
basic_test() ->
     ?assert(1 == 1).


好了,编译module,随后运行M:test(),进行单元测试,我们会看到
Test successful.
的提示。测试ok。

这里bsic_test/0会在执行test/0的时候调用,我们也可以把basic_test/0写成另一种形式:
basic_test_() ->
    fun() -> ?assert(1 == 1) end.


以"_test_"结尾的函数,在EUnit中称为“test generation function",测试生成函数,
它返回一个或一个函数list,EUnit会依次执行每个函数。为了让代码更紧凑简洁,
我们又有了另一个macro:_test,这样上面的test可以变成这样:

basic_test_() ->
    ?_test(?assert(1 == 1)).


是不是代码少一些了?好的让我们再进一步,我们使用另一个macro:_assert:
basic_test_() ->
    ?_assert(1 == 1).


怎么样,很简单了吧,好的,比如我有一系列的内容要测试,我就可以简单的写成这样:
basic_test_() ->
    [?_assert(1 == 1),
     ?_assert(2 == 2),
     ?_assertEqual(3, 3),
     ?_assertMatch(4,  4),
     ?_assertException(throw, a, throw(a))].


我们非常容易的就测试了某个表达式是否为true,某两个值是否相等assertEqual
(注:这里使用=:=进行判断,因此assertEqual(3, 3.0)不会测试通过),
某个表达式是否匹配,是否产生指定的异常等。
好了,暂时就这些基本的东西,更多的内容查看EUnit的帮助:
http://svn.process-one.net/contribs/trunk/eunit/doc/overview-summary.html

Update:
R12B-5中,eunit作为一个标准的lib被加入,eunit中提供了一些有用的Macro,如:
LET(Var,Arg,Expr)
等效于 (fun(Var) -> (Expr) end)(Arg)
用法: L = ?LET(L1, [1, 2, 3], lists:reverse(L1))

IF(Cond,TrueCase,FalseCase)
用法: G = ?IF(A >= B, A, B)

形如_test()的函数,作为一个test 单元
形如_test_()的函数作为test generator,其用来产生test单元,其结尾表达式可以为:
单个形如?_xxx的测试,表示一个test单元
也可以为一个List(可以为Deep List),List进行flatten后,长度表示test单元数目如下面代码表示五个测试单元:

basic_test() ->
    ?assert([1, 2] = lists:reverse([2, 1]).

basic_test_() ->
    [?_assert(true),
     ?_assertNot(false),
     [ ?_assert(1 == 1.0),
       ?_assert(true)
     ]
    ].
分享到:
评论
1 楼 gashero 2009-09-29  
哇,成老师真厉害,顶!

相关推荐

    erlang eunit

    文档内容分为多个章节,其中“EUnitUser’sGuide”即EUnit用户指南,是文档的核心部分,全面介绍了如何使用EUnit进行单元测试。这包括但不限于测试用例的编写、测试函数的定义、测试宏的使用、测试结果的解析以及...

    Python之PyUnit单元测试实例

    本文实例讲述了Python之PyUnit单元测试,与erlang eunit单元测试很像,分享给大家供大家参考。具体方法如下: 1.widget.py文件如下: 复制代码 代码如下:#!/usr/bin/python # Filename:widget.py class Widget: def ...

    嵌入式软件测试手册全集

    每个阶段都有其特定的测试重点和方法,例如单元测试主要验证单个程序模块的功能,而集成测试则关注模块间的交互。 2. 测试环境:建立一个真实的或模拟的硬件环境,用于测试嵌入式软件。这可能涉及到硬件仿真器、...

    S60_Platform_How_to_Develop_Unit_Tests_v1_0_en.pdf

    - **集成测试框架**:通常会使用EUnit作为Symbian上的单元测试框架。需要将EUnit库添加到项目中,并确保正确配置了编译器路径和链接器设置。 ##### 2.2 模拟依赖项 - **概念解释**:模拟(Stubbing)是一种技术,...

    Erlang Ant Library-开源

    当前,Erlang Ant库包含一项用于编译Erlang源文件的任务。 在不久的将来,将添加任务来由EDoc生成Erlang程序的文档。 在以后的一些发行版中,计划了一项任务,以运行EUnit进行单元测试。

    手机自动化测试技术漫谈及OPhone自动化测试概览

    在手机软件开发中,单元测试就属于这种类型。第二种类型则结合了手机软件的自身特点,通过对手机GUI控件元素的解析、控制和校验来进行测试。这种方式不依赖于被测对象的源代码,与被测对象的GUI实现有很强的关联性,...

    使用rebar工具开发erlang工程项目和发布erlang工程项目借鉴.pdf

    - `rebar eunit`: 运行单元测试。 - `rebar ct`: 运行行为测试(Common Test)。 - `rebar generate`: 生成可部署的释放(release)。 8. **发布与升级** - 使用rebar可以创建可发布的Erlang应用,这包括所有...

    erlang高性能网络库esockd的编译和使用(二)

    4. **测试**:编译完成后,可以运行`rebar3 eunit`进行单元测试,确保库功能正常。 ### 三、esockd的使用 1. **启动esockd应用**:在Erlang shell中,首先需要启动`esockd`应用,使用`application:start(esockd)`...

    riak_repl:Riak DC复制

    “ xyz就是这样工作的” 单元测试riak_tests EQC +脉冲测试在大规模和重负荷下进行测试波士顿集群或AWS 公开文件注意事项对于文档团队BEAM发行流程git标记将要发布的特定提交运行所有eunit测试,EQC测试,并将输出...

    erlang test 生成 dets

    例如,使用`etap`或`eunit`这样的单元测试框架来编写测试用例,确保在多线程环境下的正确性和一致性。此外,还要考虑如何有效地关闭和清理资源,避免内存泄漏。 总之,Erlang的DETs提供了一种简单而高效的方式来...

    meck:Erlang的模拟库

    为了方便Erlang开发者进行单元测试和行为测试,出现了一款名为meck的模拟库。meck是一款强大的工具,允许开发者在测试期间对Erlang模块进行模拟,以便隔离依赖项并控制其行为,从而更好地测试目标代码。 **1. 模拟...

    一种傻纸牌游戏的Erlang实现

    - **Eunit测试框架**:Erlang有内置的单元测试框架Eunit,开发者可能为游戏编写测试用例以确保其正确性。 以上是根据给定的标题和文件名推断出的一些关键知识点。实际的实现细节、代码结构和游戏玩法将取决于博文...

    OTP进程池应用程序_Erlang_Makefile_下载.zip

    3. `test/`:包含测试用例,可能使用EUnit或CT(Common Test)等测试框架编写。 4. `releases/`:可能包含应用的版本信息和启动脚本。 5. `include/`:可能包含公共头文件,定义了一些常量或宏。 6. `Makefile`:...

    getopt:Erlang模块使用GNU getopt语法解析命令行参数

    要运行单元测试,请运行rebar3 eunit 。 要构建(非常)有限的文档,请运行rebar edoc 。 要在项目中使用getopt,您可以通过以下方式将其作为依赖项添加到rebar.config文件中: { deps , [ { getopt , " 1.0.2 " } ...

    gossiperl:Erlang 中的 Gossip 中间件

    单元测试 rebar clean get-deps compile && rebar eunit skip_deps=true 作者 Radoslaw Gruchalski 执照 麻省理工学院许可证 (MIT) 版权所有 (c) 2014 Radoslaw Gruchalski radek@gruchalski.com 特

    Erlang中文基礎教程

    Erlang提供了调试工具如observer和tracer,以及单元测试框架如eunit和ct(Common Test),便于进行代码调试和测试。 ### 9. 实战应用 Erlang在实时通信、分布式计算、物联网等领域有着广泛应用,比如著名的开源...

    erlang程序设计(第二版)随书源码

    10. **测试和调试**:Erlang提供了`eunit`测试框架和`observer`工具来帮助开发者进行单元测试和系统监控。 通过深入研究《Erlang程序设计(第二版)》的随书源码,你可以逐步掌握这些关键知识点,并提升在实际项目...

    rebar的问题

    4. **运行测试**:`rebar eunit`执行单元测试,`rebar ct`则运行Common Test套件。 5. **打包应用**:`rebar escriptize`可以将应用打包成可执行的escript文件,方便分发和执行。 当遇到`rebar`问题时,通常需要...

    erlang实战IP查询服务

    - 使用Erlang自带的测试工具进行单元测试(eunit)和集成测试(common_test)。 5. **部署上线**: - 打包项目为Erlang release版本。 - 部署至生产环境。 #### 六、项目特色 - **高效性**: Erlang语言本身具有高度...

Global site tag (gtag.js) - Google Analytics