You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:04:52