Elixir 单元测试

简介:

概述

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 中的还有些模块没有尝试,以后在实际用到时再写相应的心得。



本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/6357545.html,如需转载请自行联系原作者


目录
相关文章
|
4天前
|
Java 测试技术 Maven
5个编写技巧,有效提高单元测试实践
本文作者详细讲解了关于单元测试的相关知识,做好单元测试能有效地保障代码质量,本文将手把手教你学会应用单元测试并附有案例、测试插件。
|
4天前
|
测试技术 持续交付
单元测试模块化编程
单元测试模块化编程
18 1
|
4天前
|
测试技术 Python
Python中的单元测试与测试驱动开发(TDD)实践
Python中的单元测试与测试驱动开发(TDD)实践
|
6月前
|
测试技术 开发者 Python
Python中的单元测试与测试驱动开发(TDD)指南
测试是保障代码质量的关键步骤,而Python提供了强大的测试工具和框架,让开发者能够轻松地进行单元测试和测试驱动开发(TDD)。本文将深入探讨单元测试的概念、`unittest`库的基本用法,以及如何通过TDD的方式构建高质量的Python代码。
|
设计模式 存储 NoSQL
代码重构:面向单元测试
重构代码时,我们常常纠结于这样的问题:需要进一步抽象吗?会不会导致过度设计?如果需要进一步抽象的话,如何进行抽象呢?有什么通用的步骤或者法则吗?为了保证直观,本文将以一个 “生产者消费者” 的代码重构示例贯穿始终。最后还会以业务上常见的 Excel 导出系统为例简单阐述一个业务上的重构实例。
代码重构:面向单元测试
|
测试技术 C++
开源项目推荐:C++单元测试框架googletest/Catch2/QtTest
开源项目推荐:C++单元测试框架googletest/Catch2/QtTest
649 0
|
测试技术 Python
Testify Pythoinc的单元测试框架
Testify 是Python的一款测试框架,可以替代unittest和nose。
141 0
Testify Pythoinc的单元测试框架
|
缓存 Java 测试技术
Spock单元测试框架初探
  软件工程发生在代码被非原作者阅读之时   Spock vs JUnit 单元测试框架,JUnit读者已了解,因此直接开门见山,基于JUnit和Spock做一个对比,明显Spock在工程化更有优势。 对比项 Spock JUnit 结构可读性 ✓   问题定位效率 ✓  
959 0
|
Ubuntu 测试技术 Shell
C++语言的单元测试与代码覆盖率
# 前言 测试是软件开发过程中一个必须的环节,测试确保软件的质量符合预期。 对于工程师自己来说,单元测试也是一种提升自信心的方式。 直接交付没有经过测试的代码是不太好的,因为这很可能会浪费整个团队的时间,在一些原本早期就可以发现的问题上。而单元测试,就是发现问题一个很重要的环节。 本文以C++语言为基础,讲解如何进行单元测试并生成测试报告。 在工具上,我们会使用下面这
4391 0