Erlang 从零 · 第 17 课(展开目录)
01 · 先打开 erl02 · 先认常见 term03 · 分清两种文字04 · 变量只接一次05 · 拆开一列,再筛一次06 · 把文字安全变成整数07 · 用 case 选一条路08 · 让函数继续走09 · 把代码放进模块10 · 条件必须说真话11 · 一层一层取数据12 · 文字先说清编码13 · 让函数子句排好队14 · 带着累加器往前走15 · 先看值,再选路16 · 给模块立规矩17 · 让 rebar3 管项目18 · 让结果有固定形状19 · 把磁盘当成会失败的邻居20 · 把函数交给 list21 · record 留在院里22 · 先写模块之间的约定23 · 把 term 形状写出来24 · 小测试与整段路25 · 把应用磨成命令26 · 先把小项目圈住27 · 把真实文件洗干净28 · 公开入口越少越稳29 · 把约定留在源码旁30 · 打包,也留下线索31 · 按最初任务交卷
ERLANG · 基础 · LESSON 1745 分钟

让 rebar3 管项目

创建 Erlang 应用,写第一个模块,再用 EUnit 保存例子。

01 · 先看完整例子

在项目模块中写第一个测试

先运行 rebar3 new app trail_counter,放入 src/trail_counter.erl,再执行 rebar3 eunit。

Erlang
-module(trail_counter).
-export([text_length/1]).

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

text_length(Text) ->
  erlang:length(unicode:characters_to_list(Text)).

%% _test 结尾会被 EUnit 自动发现
unicode_length_test() ->
  ?assertEqual(2, text_length(<<"长安"/utf8>>)).
先对照结果
  • 测试通过时 EUnit 显示 1 tests passed。
02 · 回头拆代码

从第一行往下读

  1. 公开函数把 UTF-8 binary 转成码点 list 后计数。
  2. EUnit 头文件提供断言宏。
  3. rebar3 负责编译测试代码并运行用例。
03 · 认清新符号

符号不是暗号

rebar3 new app name

创建 OTP 应用骨架。

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

引入 EUnit 宏。

?assertEqual(Expected, Actual)

比较期待值与实际值。

04 · 代码里的概念

把名字和意思对上

01

rebar3

Erlang/OTP 项目的构建与依赖工具。

02

EUnit

随 Erlang/OTP 提供的轻量单元测试框架。

05 · 再说清楚

这些写法为什么有用

rebar3 是常用 Erlang 构建工具。它创建项目、编译代码、管理依赖并运行测试。

应用源码通常放 src/,配置写在 rebar.config。EUnit 适合短小单元测试。

测试函数名以 _test 结尾,或使用 EUnit 生成器。?assertEqual 写出期望和实际结果。

06 · 自己改一次

合上答案,动手

再加一个空 binary 测试。

练习起点
empty_text_test() ->
  ?assertEqual(____, text_length(____)).

目标结果: 期待 text_length(<<>>) 得到 0。

卡住了,再看提示

两个空分别填 0 与 <<>>。

运行过以后,再看一种答案
一种答案
empty_text_test() ->
  %% 空 binary 没有字符
  ?assertEqual(0, text_length(<<>>)).
想一想:rebar3 是 Erlang 语言本身吗?

不是。它是项目构建工具;源码仍由 Erlang 编译器编译并在 BEAM 上运行。

带走

记住三句

  1. 1

    rebar3 管理项目构建流程。

  2. 2

    EUnit 保存可重复检查的例子。

  3. 3

    源码、配置与测试各有固定位置。

本课结束代码也跑过一次,就把这一课收好。