能否将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
相关产品推荐
相关产品推荐

