Prework:

怎样写一个基本的Eunit? Doc.

1. 加入头文件:声明此模块以”_test”结尾的函数都是测试用,并在编译时自动在这个模块里加入test()函数(当然这个可以用宏来控制)

-include_lib("eunit/include/eunit.hrl").

2.编写测试用例:”*_test()”函数":

reverse_nil_test() -> [] = lists:reverse([]).
reverse_one_test() -> [1] = lists:reverse([1]).
reverse_two_test() -> [2,1] = lists:reverse([1,2]).
%%也可以用宏:这个有好几种,很方便,要用就看文档,比不用宏的优势在于出错信息详细
length_test() -> ?assert(length([1,2,3]) =:= 3).

3. 运行 Eunit

编译Module –> 然后:

Module:test().
%%或
eunit:test(Module).

以上是一个最简单的Eunit的例子,那么:

Question: 类似gen_server有启动进程类的Eunit怎么写?有并发的怎么写?

基本Code形式:

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-compile({no_auto_import, [get/1, put/2]}). basic_test_() ->
{setup,
fun() ->
?debugFmt("Starting ~p", [?MODULE]),
case start_link() of
{error, {already_started, _}} ->
ok;
{ok, _} ->
do_stop
end
end,
fun(Stop) ->
case Stop of
do_stop -> stop();
ok -> ok
end
end,
[
{timeout, 60, fun normal_insert/0},
{timeout, 60, fun ttl_insert/0}
]
}.
noraml_insert() ->
todo.
ttl_insert() ->
todo.
-endif.
Eunit提供以下格式:
%%To make the descriptions simpler, we first list some definitions:
Setup () -> (R::any())
SetupX (X::any()) -> (R::any())
Cleanup (R::any()) -> any()
CleanupX (X::any(), R::any()) -> any()
Instantiator ((R::any()) -> Tests) | {with, [AbstractTestFun::((any()) -> any())]}
Where local | spawn | {spawn, Node::atom()}
Table .1: (these are explained in more detail further below.) %%The following representations specify fixture handling for test sets: {setup, Setup, Tests | Instantiator}
{setup, Setup, Cleanup, Tests | Instantiator}
{setup, Where, Setup, Tests | Instantiator}
{setup, Where, Setup, Cleanup, Tests | Instantiator}
Setup     () -> (R::any())
SetupX (X::any()) -> (R::any())
Cleanup (R::any()) -> any()
CleanupX (X::any(), R::any()) -> any()
Instantiator ((R::any()) -> Tests) | {with, [AbstractTestFun::((any()) -> any())]}
Where local | spawn | {spawn, Node::atom()}

我们上面就是用的: {setup,Setup,Cleanup,TestList}这种,所以用Setup启动,运行TestList后用启动Setup的返回值传入Cleanup(Val)结束!注意这个test一定是xxx_test_()的形式,注意最后的_ 

可以看出_test_()的范围比_test()的大,但是限定为fun() –> end.

Tip: 如果你想用新起进程来测试一个模块【gen_server是不需要这样子的,本来就是新起了个进程】可以参照Where参数。

通过以上,我们就可以写出很漂亮的gen_server的enuit函数啦!!

那么如何让多个enuit并行跑呢?比如不相关的几个gen_server并行跑起来!

用参数:inparallel

base_test_() ->
{setup, spawn,
fun() -> start() end,
fun(_) -> stop() end,
{inparallel, 3,[
{timeout, 60, funnormal_insert/0},
{timeout, 60, ttl_insert/0}
]}
}.

惊喜:可以指定同时跑几个哦,上面指定了3个,不指定也可以的.

========================================================

一个好的application一定要有可靠的测试用例!,但是如果你在程序里面大量用有副作用的进程字典,还是很难写enuit的…

[Erlang05]gen_server怎么去写eunit?的更多相关文章

  1. 如果简单的记录,就可以为这个世界创造更多的财富,那么还有什么理由不去写博客呢? — 读<<黑客与画家>> 有感

    上一次博文发文时间是2016.1.15,7个月已经过去了.最近读了一本<>的书,对我触动挺大的!里面有关于技术趋势的探讨,也有关于人生和财富的思考! 开始更新iOS122的文章的初衷是,聚 ...

  2. 【转载】这样去写你的HTML

    昨天在 twitter 上说,怎么忍心把页面写得这么难用?是的,这个世界还有一群人等着我们创建出来的东西,可以让他们的生活能过得更容易呢.比如那些需要读屏软件的用户.作为一个前端,我们又怎么会忍心呢. ...

  3. 用node.js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

  4. 如何在嵌套的app中运用vue去写单页面H5

    本文主要介绍移动端.为了避免移动端兼容出现各种奇奇怪怪的bug,所以秉承着能不用复杂的语法就不用,尽量用最基础的语法. 可用惯了各种ES6语法的童鞋们,写原生真是头疼,再加上各种领导催工期,肯定是内心 ...

  5. 怎样去写线程安全的代码(Java)

    使用多线程就可能会存在线程安全的问题.很多 java 程序员对写多线程都很挣扎,或者仅仅理解那些是线程安全的代码,那些不是.这篇文章我并不是详述线程安全,详述同步机制的文章,相反我只是用一个简单的非线 ...

  6. Python怎么去写单元测试用例去测试hello world呢

    逛着博客园,看到乙醇大佬的一篇随笔 https://www.cnblogs.com/nbkhic/p/9370446.html,于是就在想怎么测试这句hello world print('hello ...

  7. 【github】论怎么去写一个高大上的ReadMe

    前言 以前我时常觉得,自己写的ReadMe很单调乏味,但后来仔细研究一下后,发现有很多方式可以让ReadMe在简洁的基础上变得好看些,所以在这里和大家分享,如果大家有更好的想法,也非常欢迎在评论区留言 ...

  8. 靠!老师居然叫我们去写博弈论!!!结果写了一个晚上的博弈论,简直要死QAQ。。。发发博客休息一下。。。TAT。。。

    萌萌的糖果博弈 题目描述: 用糖果来引诱小朋友学习是最常用的手法,绵羊爸爸就是用糖果来引诱萌萌学习博弈的.他把糖果分成了两堆,一堆有A粒,另一堆有B粒.他让萌萌和他一起按照下面的规则取糖果:每次可以任 ...

  9. 用android去写一个小程序

    前言: 软工的一个小作业:实现"黄金分割小游戏", 需要结对编程,队友:陈乐云    共用时两天. 早期思路设计: 采用键值对的形式,以Map作为存储结构.优点:能够将数据与用户对 ...

随机推荐

  1. Service和Thread的关系

    Service确实是运行在主线程里的,也就是说如果你在Service里编写了非常耗时的代码,程序必定有问题. Android的后台就是指,它的运行是完全不依赖UI的.即使Activity被销毁,或者程 ...

  2. Asp.net 的工作原理

     转:http://www.cnblogs.com/linjiancun/archive/2010/09/14/1825662.html 1.1.1          Asp.net 的工作原理 ...

  3. 「小程序JAVA实战」小程序上传短视频(46)

    转自:https://idig8.com/2018/09/14/xiaochengxujavashizhanxiaochengxushangchuanduanshipin45/ 个人信息:用户上传短视 ...

  4. C/C++快速入门

    sscanf与sprint 均在stdio.h头文件下 sscanf用法 sscanf(str, "%d", &n); // 将str中内容以"%d"的 ...

  5. 值得一做》关于一道暴搜BZOJ1024(EASY+)

    为什么要写这道题的DP捏? 原因很简单,因为为原来在openjudge上有一道题叫分蛋糕,有一个思路和这道题很像:“分锅”. 分锅:即为考虑计算当前情况的最优解时,把当前状态结果,分散为考虑当前状态的 ...

  6. Struts2源代码查看

    -----------------siwuxie095 Struts2 源代码查看 1.Struts2 的核心过滤器 StrutsPrepareAndExecuteFilter 实现了 Filter ...

  7. 上传工程到github

    这里主要讲讲如何在mac底下使用github,我刚开始使用时,还是费了一点功夫的,因为网上的资料比较杂,有些不是太准确.故将自己的安装过程比较详细的分享下,方便有需要的人,攒点人品. 首先你得完成如下 ...

  8. Qt + OpenSenceGraph(osg) 加载OSG模型

  9. Docker CE部署

    一.概述 Docker 在1.13版本之后,从2017年的3月1日开始,版本命名规则变为如下: 项目 说明 版本格式 YY.MM Stable 每个季度发行 Edge版本 每个月发行 同时Docker ...

  10. qmake not exec in ubuntu

    Description Today, I want to run qmake command in terminal, but, it has error message such qmake: co ...