Parasoft C/C++test如何使用桩函数替代MFC窗口类顺利执行单元测试

在现代软件开发过程中,自动化单元测试是确保代码质量与可靠性的关键环节。尤其对于特定框架(如MFC)的代码,测试复杂度显著增加,常因依赖外部资源或交互操作而难以在静默环境中顺利执行。Parasoft C/C++test作为专业的软件测试工具,致力于帮助开发团队高效实施自动化测试,通过其强大的桩函数功能,能够有效模拟依赖组件的行为,从而实现对复杂逻辑的隔离测试。

C++test单元测试通常是要求被测试单元能够在静默的情况下执行,而不需要太多的人为交互操作。所以在测试类似于下面的MFC窗口代码时,会执行失败。或者无法执行到窗口初始化以后的代码。

lang-js 复制代码
void CCOMTestDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

在这里我们为了能够执行到IF判断为TRUE的语句。需要对IsIconic()打桩。手动返回TRUE的值。

桩函数内容为返回true。

再次执行后,发现执行都会在下面这行代码中停下来,执行失败。

在质量任务面板中发生运行时异常。

这是因为CPaintDC dc(this); 这个语句是需要初始化this这个对象,而this是一个窗口程序。初始化一个图形化的组件,而测试它会涉及到非常多的额外工作。比如需要初始化整个应用程序,包括GUI的组件。然后在测试的时候通常也会需要打开窗口,按按钮这些需要人来 参与的交互式方式,但是这些都不是单元测试的方式。在测试这个部分的时候,一个方面是需要一些人为的操作或者初始化一些具体的对象和窗口,所以这个部分通常会以报告异常来提示用户。

对一些关于"view"部分的代码通过打桩来替代其真实调用。

比如我们可以对这个例子的CPaintDC dc(this)打桩。右键选择这个函数,生成用户自定义桩函数,然后再次执行测试用例。

那么这个当初在测试执行过程中运行不到的代码会正常的通过,后续的逻辑代码也就能测试到了。

当然这个例子桩函数不需要设计太多的代码。如果对于一些需要桩函数返回特定的值,或者需要初始化某些变量的情况,则需要手动完成。

Parasoft C/C++test在应对GUI及框架相关代码的单元测试中表现出了卓越的灵活性与实用性。其打桩机制不仅解决了测试环境对图形组件的依赖问题,还显著提升了测试的自动化程度和可重复性。此外,Parasoft C/C++test还提供静态代码分析、运行时错误检测、覆盖率统计等全面功能,能够帮助客户在开发早期发现潜在缺陷,优化代码结构,并确保符合行业标准与合规要求。

相关推荐
努力努力再努力wz2 天前
【Lua进阶系列】Lua 调试机制详解:从虚拟机调用栈、错误传播到 debug 库
junit·单元测试·lua
code2cat5 天前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
七夜zippoe8 天前
Agent 测试实战:单元测试、集成测试与 Mock LLM 策略
ai·单元测试·集成测试·mock·agent
梦想不只是梦与想10 天前
鸿蒙 AI自动化测试实现
单元测试·harmonyos·hypium
光影62710 天前
Unittest单元测试基础速记
测试工具·单元测试·json·测试覆盖率
龙智DevSecOps解决方案11 天前
TESSY基于需求的单元测试教程:需求关联、覆盖率与可疑测试处理
单元测试·视频教程·tessy
努力努力再努力wz11 天前
【Lua 入门系列】从顺序执行到分支与循环:一文理解 Lua 控制结构、作用域与跳转规则
junit·单元测试·lua
xiaoye-duck12 天前
《C++ 工具库实战》GTest 单元测试:断言、全局环境、局部夹具与底层原理
c++·单元测试·第三方库
小凯在掘金13 天前
测试规范:为什么优先用 data-testid,而不是 CSS 选择器?
单元测试·测试