Loading
0

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

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

>>点击获取Parasoft C/C++test试用

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

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还提供静态代码分析、运行时错误检测、覆盖率统计等全面功能,能够帮助客户在开发早期发现潜在缺陷,优化代码结构,并确保符合行业标准与合规要求。

关于慧都

慧都科技(EVGET)成⽴于2003年,是⼀家⾏业数字化解决⽅案公司,⻓期专注于软件、油⽓与制造⾏业。公司基于深⼊的业务理解与管理洞察,以系统化的业务建模驱动技术落地,帮助企业实现智能化运营与⻓期竞争优势。

慧都科技作为Parasoft公司在中国区的官方授权合作伙伴,为国内企业提供Parasoft C/C++test产品的正版授权、定制化部署与全生命周期技术支持与服务。我们致力于助力客户精准贯彻功能安全标准、全面提升软件开发效率、有效管控项目风险,最终构建符合国际标准的高质量软件体系。