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. 【Consul】Consul实践指导-配置文件

    Agent有各种各样的配置选项,这些配置选项可以通过命令行参数的方式设定,也可用通过配置文件的方式设定--所有的配置选项都是可选的,当然也是有默认值的. 当加载配置选项时,consul是按照词典顺序从 ...

  2. (转)C#命名规范

    C#命名规范   数据类型 数据类型简写 标准命名举例 Array arr arrShoppingList Boolean                         bln blnIsPostB ...

  3. 解题报告Best Time to Buy and Sell Stock with Cooldown

    题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ...

  4. 15-Call to your teacher(有向图的连通判断)

    链接:https://www.nowcoder.net/acm/contest/76/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...

  5. C++ std::unordered_map

    std::unordered_map template < class Key, // unordered_map::key_type class T, // unordered_map::ma ...

  6. 读取位图(bitmap)实现及其要点

    位图的格式如下: 1.文件头信息块 0000-0001 :文件标识,为字母ASCII码“BM”. 0002-0005 :文件大小. 0006-0009 :保留,每字节以“00”填写. 000A-000 ...

  7. code2800 送外卖

    首先,对图进行一次Floyd(g[][]是图) 1.dfs:(u是当前在的节点,d是已经走的路程) void dfs(int u,int d){ if(d>=ans)return; bool f ...

  8. [JAVA] 小数转百分数

    import java.text.NumberFormat; //获取格式化对象 NumberFormat format = NumberFormat.getPercentInstance(); // ...

  9. JMS 之 Active MQ 的消息传输

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...

  10. 在git bash中使用命令行调用tortoisegit提交代码或查看日志

    Tortoisegit commit / show log命令行 TortoiseGitProc.exe /command:commit TortoiseGitProc.exe /command:lo ...