Elixir 从零 · 第 17 课(展开目录)
01 · 先让代码说话02 · 先认六种值03 · 把值装起来04 · 从旧 list 生成新 list05 · 让形状对上06 · 用 case 做选择07 · 把文字安全变成整数08 · 拆开 &1 和管道09 · 把代码放进项目10 · 真假不只靠 true11 · 走进嵌套数据12 · 一字不一定一字节13 · 让函数按形状接活14 · 把一列数收成一个值15 · 给不同问题选不同路16 · 给 map 一张名片17 · 让项目自己验答案18 · 让成功和失败长得一样19 · 读写文件先管好路20 · 只算眼前需要的21 · 同一句话,不同做法22 · 先约好模块会做什么23 · 把数据形状写在门口24 · 测试不只看一条好路25 · 把项目磨成一个命令26 · 定下小项目边界27 · 把真实文字洗干净28 · 只开三扇门29 · 把约定钉在代码旁30 · 打包,也留下脚印31 · 照任务书交卷
ELIXIR · 基础 · LESSON 1740 分钟
让项目自己验答案
创建 Mix 项目,写第一个模块,再用 ExUnit 守住结果。
01 · 先看完整例子
先写行为,再运行测试
先运行 mix new trail_counter,再把代码放进对应文件,执行 mix test。
Elixir
# lib/trail_counter.ex
defmodule TrailCounter do
def length(text), do: String.length(text)
end
# test/trail_counter_test.exs
defmodule TrailCounterTest do
use ExUnit.Case, async: true
test "计算中文字符数" do
assert TrailCounter.length("长安") == 2
end
end先对照结果
- 测试通过时显示
1 test, 0 failures。
02 · 回头拆代码
从第一行往下读
- 公开函数只做一件事:返回字符串字符数。
- 测试名用一句话说明行为,不复述实现。
async: true允许安全的测试模块并行运行。
03 · 认清新符号
符号不是暗号
mix new name创建一个新的 Mix 项目。
use ExUnit.Case让当前测试模块使用 ExUnit 功能。
assert left == right要求比较结果为真,否则测试失败。
04 · 代码里的概念
把名字和意思对上
测试用例
给一份输入,写清期待输出,并让工具自动比较。
回归
新修改意外弄坏了原来能工作的行为。已有测试能尽早发现它。
05 · 再说清楚
这些写法为什么有用
手动试一次只能说明刚才没出错。测试把例子保存下来,以后每次修改都能重新检查。
mix new 建好项目骨架。源码放 lib/,测试放 test/,项目配置在 mix.exs。
ExUnit 测试由 test 块组织,assert 写出你期待的结果。
06 · 自己改一次
合上答案,动手
再加一个空字符串测试。
练习起点
test "空文字长度为零" do
assert TrailCounter.length(____) == ____
end目标结果: 两个测试都通过。
卡住了,再看提示
输入写 "",期待值写 0。
运行过以后,再看一种答案
一种答案
test "空文字长度为零" do
# 空字符串没有可见字符
assert TrailCounter.length("") == 0
end想一想:测试通过是否能证明程序永远没有错误?
不能。它只说明列出的例子通过;边界和错误输入仍需要继续补测试。
带走
记住三句
- 1
源码与测试分开放置。
- 2
测试保存可重复检查的例子。
- 3
每修一个错误,就考虑补一个能重现它的测试。
本课结束代码也跑过一次,就把这一课收好。