disaste0_0 2024-02-14 07:01 采纳率: 81.6%
浏览 9
已结题

C++单元测试覆盖100%


// Dynamic Array Class
// array.h
#include <iostream>

class Array {
    int* a;
    int n;
    int dummy;
    void init(const Array&);
public:
    Array(int = 0);
    ~Array();
    Array(const Array&);
    Array& operator=(const Array&);
    int& operator[](int);
    int length() const;
};
// Dynamic Array Class
// array.cpp

#include <new>
#include "Array.h"

void Array::init(const Array& s) {
    if (s.n > 0) {
        a = new (std::nothrow) int[s.n];
        if (a) {
            n = s.n;
            dummy = s.dummy;
            for (int i = 0; i < n; i++)
                a[i] = s.a[i];
        }
    }
    else if (s.n < 0)
    {
        std::cerr << "Oops!  Something went wrong" << std::endl;
    }
    else {
        a = nullptr;
        n = 0;
        dummy = 0;
    }
}
Array::Array(int no) : n(no), dummy(0) {
    if (n > 0)
        a = new (std::nothrow) int[n];
    else
    {
        a = nullptr;
        n = 0;
    }
}
Array::~Array() { delete[] a; }
Array::Array(const Array& s) { init(s); }
Array& Array::operator=(const Array& s) {
    if (&s != this) {
        delete[] a;
        init(s);
    }
    return *this;
}
int& Array::operator[](int i) {
    if ((i >= 0) && (i < n))
        return a[i];
    else
        return dummy;
}

int Array::length() const {
    return n;
}

img

我写了个单元测试来测试Array,但其中有两个判断不太懂应该怎么去测试,不管怎么写都覆盖不到

  • 写回答

4条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-14 07:02
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,您可以参考如下,如果回答的不正确,及时评论区回复我,我会根据你错误描述追加回复。如果解决了您的问题,麻烦帮我点击个采纳!谢谢您的肯定!

    你的代码中有一个dummy成员变量,但是它没有在任何公开的接口中使用。这意味着你无法直接通过公共API来测试它的行为。然而,你可以通过一些间接的方式进行测试。

    首先,解释一下你无法覆盖到的两个情况:

    1. else if (s.n < 0):这里处理了传入负数的情况,你可以在构造函数或赋值运算符中传入一个负数的数组长度来触发这个分支。
    2. else { a = nullptr; n = 0; dummy = 0; }:这是当输入为0时的处理,你已经用Array(int no)构造函数测试了n > 0的情况,所以现在只需要测试n == 0

    以下是一些可能的测试用例来覆盖这些未被覆盖的代码路径:

    TEST(ArrayTest, NegativeLengthConstructor) {
        // 测试负数长度构造函数
        try {
            Array arr(-1);
            FAIL() << "Expected exception not thrown";
        } catch (std::exception& e) {
            EXPECT_STREQ("Oops!  Something went wrong", e.what());
        }
    }
    
    TEST(ArrayTest, ZeroLengthConstructor) {
        // 测试0长度构造函数
        Array arr(0);
        EXPECT_EQ(nullptr, arr.a);  // 检查指针是否为nullptr
        EXPECT_EQ(0, arr.length());  // 长度应为0
        EXPECT_EQ(0, arr.dummy);  // 尽管我们不能直接访问dummy,但我们期望它为0(假设默认构造)
    }
    
    TEST(ArrayTest, CopyAssignmentWithNegativeLength) {
        // 测试赋值运算符与负数长度
        Array original(-1);
        Array copied;
        copied = original;
        EXPECT_EQ(nullptr, copied.a);  // 指针应为nullptr
        EXPECT_EQ(0, copied.length());  // 长度应为0
        EXPECT_EQ(0, copied.dummy);  // 假设dummy保持不变
    }
    

    请注意,你需要包含 <gtest/gtest.h> 并且设置GTest环境才能运行这些测试用例。如果你不使用GTest,可以使用其他单元测试框架,如 Catch2 或 Boost.Test,它们的工作方式类似。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月14日
  • 创建了问题 2月14日

悬赏问题

  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
  • ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
  • ¥20 firefly-rk3399上启动卡住了