如何使用Common Test测试gen_server模块?附简易实现代码
没问题,我来一步步教你怎么用Common Test测试你的rand_gen gen_server模块~
使用Common Test测试rand_gen GenServer
Common Test是Erlang官方针对OTP行为的测试框架,非常适合覆盖gen_server的启动、停止以及核心业务接口测试。下面是完整的测试实现步骤:
第一步:搭建测试目录结构
先在你的项目根目录下创建一个test文件夹,专门存放测试代码。然后在这个文件夹里新建测试套件文件rand_gen_SUITE.erl。
第二步:编写测试套件代码
下面是适配你rand_gen模块的完整测试代码,我会逐部分解释:
-module(rand_gen_SUITE). -compile(export_all). -include_lib("common_test/include/ct.hrl"). %% 定义要执行的所有测试用例 all() -> [start_stop_smoke_test, uniform_single_arg_test, uniform_range_test]. %% 每个测试用例执行前的初始化:启动rand_gen服务 init_per_testcase(_TestCase, Config) -> {ok, Pid} = rand_gen:start(), [{server_pid, Pid} | Config]. %% 每个测试用例结束后的清理:停止rand_gen服务 end_per_testcase(_TestCase, Config) -> Pid = ?config(server_pid, Config), ok = rand_gen:stop(Pid), Config. %% 测试服务的启动与停止功能 start_stop_smoke_test(Config) -> Pid = ?config(server_pid, Config), % 验证服务进程正常存活 true = is_pid(Pid), true = erlang:is_process_alive(Pid), % 停止后验证进程已退出 ok = rand_gen:stop(Pid), false = erlang:is_process_alive(Pid). %% 测试uniform/1接口:返回值需在1到BASE(1000)范围内 uniform_single_arg_test(Config) -> Pid = ?config(server_pid, Config), RandVal = rand_gen:uniform(Pid), % 断言返回值符合范围要求 true = RandVal >= 1, true = RandVal =< 1000, % 对应你模块里的?BASE宏 % 打印调试日志,方便排查问题 ct:pal("uniform/1 返回值: ~p", [RandVal]). %% 测试uniform/2接口:返回值需在指定的区间内 uniform_range_test(Config) -> Pid = ?config(server_pid, Config), Min = 50, Max = 150, RandVal = rand_gen:uniform(Pid, Min, Max), % 断言返回值在指定区间内 true = RandVal >= Min, true = RandVal =< Max, ct:pal("uniform/2(~p,~p) 返回值: ~p", [Min, Max, RandVal]).
代码细节说明:
all/0:告诉Common Test要执行哪些测试用例,你可以随时添加新的测试项。init_per_testcase/2:每个测试用例执行前自动启动服务,把进程ID存在配置里,避免重复写启动逻辑。end_per_testcase/2:每个测试结束后自动停止服务,防止残留进程影响后续测试。- 三个测试用例分别覆盖了服务启停的基础功能、单参数随机数生成、指定范围随机数生成,基本覆盖了你模块的核心逻辑。
第三步:运行测试
在项目根目录下,用Erlang自带的ct_run命令执行测试:
ct_run -suite test/rand_gen_SUITE.erl
如果你的项目用rebar3管理,也可以用更简洁的命令:
rebar3 ct
测试完成后,Common Test会在_build/test/logs目录生成HTML格式的详细报告,打开就能看到每个测试用例的执行结果。
额外小贴士
- 如果你的
rand_gen有异常场景需要测试(比如调用已停止的服务),可以新增测试用例验证错误返回值。 - 可以用
ct:pal/2打印更多调试信息,方便定位问题。 - 如果你的
start/0或uniform接口参数有变化,记得同步调整测试代码里的调用逻辑。
内容的提问来源于stack exchange,提问作者user4695271
相关产品推荐
相关产品推荐

