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

能否将Quiviq QuickCheck与Erlang Eunit集成?如何在eunit:test/2中运行?

集成Quiviq QuickCheck与EUnit:同时生成报告并展示测试细节

要实现二者集成,核心思路是把QuickCheck的property包装成EUnit可识别的测试用例,同时在包装逻辑中捕获QuickCheck的测试结果、失败细节和统计数据,最终通过EUnit的报告体系输出。以下是具体实现步骤:

1. 编写QuickCheck测试包装模块

创建专门的测试模块,将每个QuickCheck property封装成EUnit测试函数,同时处理测试结果的断言和信息输出:

-module(qc_eunit_integration).
-include_lib("eunit/include/eunit.hrl").
-include_lib("eqc/include/eqc.hrl").

%% 定义QuickCheck测试Property
prop_add_zero() ->
    ?FORALL(X, int(), X + 0 =:= X).

prop_mul_one() ->
    ?FORALL(X, int(), X * 1 =:= X).

%% 错误示例:故意让Property失败用于测试
prop_broken() ->
    ?FORALL(X, int(), X + 1 =:= X).

%% 包装成EUnit测试用例(带超时和结果处理)
qc_add_zero_test_() ->
    {timeout, 60,  % 给QuickCheck足够的运行时间,避免超时终止
     fun() ->
         % 指定测试用例数量并开启统计收集
         {Result, Stats} = eqc:quickcheck(eqc:numtests(1000, prop_add_zero()), [stats]),
         handle_qc_result(Result, Stats, "加法恒等性测试")
     end}.

qc_mul_one_test_() ->
    {timeout, 60,
     fun() ->
         {Result, Stats} = eqc:quickcheck(eqc:numtests(1000, prop_mul_one()), [stats]),
         handle_qc_result(Result, Stats, "乘法恒等性测试")
     end}.

qc_broken_test_() ->
    {timeout, 60,
     fun() ->
         {Result, Stats} = eqc:quickcheck(eqc:numtests(1000, prop_broken()), [stats]),
         handle_qc_result(Result, Stats, "错误示例测试")
     end}.

%% 通用结果处理函数,避免重复代码
handle_qc_result(true, Stats, TestName) ->
    TotalTests = proplists:get_value(numtests, Stats),
    ?debugFmt("[~s] 测试通过:共运行~p个用例,0次失败", [TestName, TotalTests]);
handle_qc_result({false, Counterexample}, Stats, TestName) ->
    TotalTests = proplists:get_value(numtests, Stats),
    Failures = proplists:get_value(failures, Stats, 0),
    % 用EUnit断言抛出错误,将QuickCheck的失败细节注入EUnit报告
    ?assert(false, io_lib:format("[~s] 测试失败:~p次失败/~p个用例,反例:~p", 
                                 [TestName, Failures, TotalTests, Counterexample])).

2. 运行集成测试并生成报告

直接调用EUnit的测试函数即可触发所有包装后的QuickCheck测试:

% 控制台输出详细测试信息
eunit:test(qc_eunit_integration, [verbose]).

% 生成HTML/Surefire格式报告(适用于CI工具)
eunit:test(qc_eunit_integration, [verbose, {report, {eunit_surefire, [{dir, "./eunit_reports"}]}}]).

关键细节说明

  • 超时设置:QuickCheck可能会运行上千个测试用例,必须给每个测试用例设置足够的超时时间(比如60秒),防止EUnit提前终止测试。
  • 统计数据收集:通过[stats]选项获取QuickCheck的运行统计,包括总测试数、失败数等,直接展示在EUnit报告中。
  • 失败细节注入:利用?assert(false, Message)将QuickCheck的反例和失败统计作为错误信息传递给EUnit,确保失败原因清晰可见。

运行后,EUnit会生成统一的测试报告,每个失败的QuickCheck测试都会在报告中显示具体的反例、失败次数和总测试数,同时通过控制台或HTML文件输出完整的测试结果。

内容的提问来源于stack exchange,提问作者Piskator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:05:46