概述

elixir 中自带了单元测试框架 ExUnit ,其中提供单元测试的一系列,主要包含以下模块:

  1. ExUnit: 单元测试框架
  2. ExUnit.Assertions: 断言
  3. ExUnit.Case: 测试用例
  4. ExUnit.DocTest: 在注释写测试用例,类似 python 的 doctest
  5. ExUnit.Callbacks: 单元测试中回调
  6. ExUnit.CaseTemplate: 测试用例模板,用在有大量同类测试的场景
  7. ExUnit.Test: 单元测试信息,用于描述单元测试本身,相当于单元测试的元数据
  8. ExUnit.TestCase: 测试用例信息,用于描述单元测试用例本身,相当于测试用例的元数据
  9. ExUnit.CaptureIO 和 ExUnit.CaptureLog: 辅助测试时获取 IO 和 log 的输出
  10. ExUnit.Formatter: 格式化测试输出的信息
  11. ExUnit.Filters: 控制测试用例的过滤

一般主要使用的模块是 ExUnit.Assertions,ExUnit.Case,ExUnit.DocTest

单元测试

下面通过各种测试用例的场景,来实际应用上面提到的各个模块。

构造一个测试场景

为了简单,假定测试的对象是一个计算器,包含基本的加减乘除运算。 创建工程,然后添加 加减乘除 四个方法:

$ mix new calc
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/calc.ex
* creating test
* creating test/test_helper.exs
* creating test/calc_test.exs Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more: cd calc
mix test Run "mix help" for more commands.

工程自动生成的代码 lib/calc.ex 中带有一个示例函数 hello

defmodule Calc do
@moduledoc """
Documentation for Calc.
""" @doc """
Hello world. ## Examples iex> Calc.hello
:world """
def hello do
:world
end
end

上面的 ##Examples 下的就是 doctest

然后,在上面的 Calc module 中增加4个简单的带测试函数:

def add(x, y) do
x+y
end def minus(x, y) do
x-y
end def mul(x, y) do
x*y
end def division(x, y) do
div x, y
end

添加测试case (test/calc_test.exs)

针对上面4个方法,各写几个测试 case 如下:

defmodule CalcTest do
use ExUnit.Case test "add method test" do
assert Calc.add(3, 3) == 6
end test "add method test 2" do
refute Calc.add(3, 3) == 5
end test "minus method test" do
assert Calc.minus(3, 3) == 0
end test "multiply method test" do
assert Calc.mul(3, 3) == 9
end test "division method test" do
assert Calc.division(3, 3) == 1
end
end

其中,test 方法来自于模块 ExUnit.Case, assert,refute 等来自于 ExUnit.Assertions 模块。 其他 assertion 参考: https://hexdocs.pm/ex_unit/ExUnit.Assertions.html

设置统一的测试参数

上面的测试是最基本的示例,上面的测试用例中每个用例的参数都是 (3,3),可以用 setup 方法统一设置每个case的相同参数。

defmodule CalcTest do
use ExUnit.Case, async: true setup do
{:ok, [x: 3, y: 3]}
end test "add method test", context do
assert Calc.add(context[:x], context[:y]) == 6
end test "add method test 2", context do
refute Calc.add(context[:x], context[:y]) == 5
end test "minus method test", context do
assert Calc.minus(context[:x], context[:y]) == 0
end test "multiply method test", context do
assert Calc.mul(context[:x], context[:y]) == 9
end test "division method test", context do
assert Calc.division(context[:x], context[:y]) == 1
end
end

除了 setup,还有 setup_all 方法也可以设置每个 case 的共通参数。 不同之处在于 setup 每个 test 执行之前都会运行。

测试中的回调

测试回调除了上面的 setup 和 setup_all 之外,还有一个 on_exit 回调,在每次测试case执行完之后运行。 以上回调属于 ExUnit.Callbacks 模块。

上面的setup中加入 on_exit 的回调:

setup context do
on_exit fn ->
IO.puts "#{context[:test]} finished!"
end {:ok, [x: 3, y: 3]}
end

context[:test] 中是每个 test 后跟的字符串。 修改后执行结果如下:

$ mix test
test multiply method test finished!
.test add method test 2 finished!
.test add method test finished!
.test division method test finished!
.test minus method test finished!
. Finished in 0.04 seconds
5 tests, 0 failures Randomized with seed 604679

总结

elixir 中自带了完善的单元测试库,但是没有 mock 库,因为 elixir 社区不推荐使用 mock, 社区认为如果代码遵循良好的设计规范,就会很容易测试。

此外,ExUnit 中的还有些模块没有尝试,以后在实际用到时再写相应的心得。

Elixir 单元测试的更多相关文章

  1. 关于Elixir游戏服设计系列

    写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...

  2. elixir mix 简介

    概述 mix 是 elixir 工程的构建工具,利用 mix,可以快速方便的创建 elixir 工程,写单元测试,管理 elixir 包的依赖管理等等. 我觉得刚开始学习 elixir 的时候,先简单 ...

  3. elixir mix开发入门

    备注: 简单使用mix 进行项目的生成,同时添加docker 构建支持 1. 生成项目 mix new mydemoproject 输出信息如下: * creating README.md * cre ...

  4. Intellij idea添加单元测试工具

    1.idea 版本是14.0.0 ,默认带有Junit,但是不能自动生成单元测试,需要下载JunitGererator2.0插件 2.Settings -Plugins,下载 JunitGenerat ...

  5. Python的单元测试(二)

    title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...

  6. Python的单元测试(一)

    title: Python的单元测试(一) author: 青南 date: 2015-02-27 22:50:47 categories: Python tags: [Python,单元测试] -- ...

  7. javascript单元测试框架mochajs详解

    关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...

  8. 使用NUnit为游戏项目编写高质量单元测试的思考

    0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...

  9. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

随机推荐

  1. FMDB源码解析

    上一篇博客讲述SQLite的使用,本篇将讲述FMDB源码,后面也会讲解SQLite在使用与FMDB的区别.本篇读下来大约20-30分钟,建议大家先收藏一下. FMDB是以OC方式封装SQLite中C语 ...

  2. 安装并使用Jupyter Notebook

      Jupyter Notebook是一个交互式笔记本,支持运行 40 多种编程语言.笔者在写博客文章时,常常需要贴代码,一贴就是一大堆代码,这样不便于读者阅读,而使用Jupyter Notebook ...

  3. [转]Node.js中koa使用redis数据库

    本文转自:https://blog.csdn.net/offbye/article/details/52452322 Redis是一个常用的Nosql数据库,一般用来代替Memcached做缓存服务, ...

  4. 【转载】阿里云ECS Linux服务器禁止某些IP访问

    在阿里云ECS Linux服务器运维过程中,如果发现某些IP访问异常,如怀疑有攻击行为或者怀疑是别人写的爬虫程序长时间占用你的服务器资源,则可以通过相关的设置来禁止这些IP段的访问,拒绝这些IP的请求 ...

  5. ASP.NET Core中的Startup类

    ASP.NET Core程序要求有一个启动类.按照惯例,启动类的名字是 "Startup" .Startup类负责配置请求管道,处理应用程序的所有请求.你可以指定在Main方法中使 ...

  6. EF怎样实现ORM思想的(转载)

    EF简介 实体框架(Entity Framework)简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(O/R Mapping)解决方案.是ADO.NET中的一组支持开发面向数据的软件应 ...

  7. LNMP 一键安装 yum install php-mcrypt libmcrypt libmcrypt-devel

    centos源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包 有两种方法解决,一种是使用第三方源,这样还可以使用yum来安装,简单方便,坏处是第三方源多少有中不可靠的感 ...

  8. wx-charts 微信小程序图表 -- radarChart C# .net .ashx 测试

    radarChart:原始代码 new wxCharts({ canvasId: 'radarCanvas', type: 'radar', categories: ['1', '2', '3', ' ...

  9. Netty实现一个简单聊天系统(点对点及服务端推送)

    Netty是一个基于NIO,异步的,事件驱动的网络通信框架.由于使用Java提供 的NIO包中的API开发网络服务器代码量大,复杂,难保证稳定性.netty这类的网络框架应运而生.通过使用netty框 ...

  10. MMU学习总结

    待完善 一.MMU主要完成哪些事务? 二.PowerPC上的BAT.LAW是做什么用的? 三.