如何最好地将C++中的两个数组与单元测试进行比较以验证它们是否匹配?

ash*_*d23 -1 c++ arrays testing

目前,我有一个程序从文件中读取和提取多个数据,我想确保这些值正确匹配预期的值,我知道这应该如何在其他编程语言如python中工作使用列表和元组等,但我不确定在C++中使用单元测试的最佳方法,同时尽可能保持代码的最小化和高效.我目前有多个阵列,我希望验证它们是否符合预期值,因此我可以使用不同的输入文件测试程序.

为了描述这一点,实质上,我希望验证例如的内容

int arrayone [5] = { 11, 12, 13, 14, 15 };
Run Code Online (Sandbox Code Playgroud)

等于{11,12,13,14,15}

如果值相等则成功完成单元测试,如果它们不相同或不相同则失败.因此,我正在寻找最好的方法来解决这个问题.

Ted*_*gmo 6

std::array改为使用C++ ,您将从它公开的所有方法中获益,例如operator==:

#include <iostream>
#include <array>

int main() {
    std::array arrayone{ 11, 12, 13, 14, 15 };
    std::array facit{ 11, 12, 13, 14, 15 };

    if(arrayone==facit) {
        std::cout << "true\n";
    } else {
        std::cout << "false\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

或者对于C++ 11和C++ 14:

std::array<int, 5> arrayone{ 11, 12, 13, 14, 15 };
std::array<int, 5> facit{ 11, 12, 13, 14, 15 };
Run Code Online (Sandbox Code Playgroud)

  • @Omid在C++ 17中不需要,OP没有指定版本..但我添加它以使其清楚. (2认同)

Yks*_*nen 5

std::mismatch()将完成工作并提供更多信息std::equal.如果您更改auto为,这将适用于预C++ 11编译器std::pair<int*, int*>

#include <algorithm>

int expectedResult[5] = {11, 12, 13, 14, 15};
int* arr1end = arrayone + 5;

//I assume here that expectedResult is the same length as arrayone (5).
auto res = std::mismatch(arrayone, arr1end, expectedResult);
if(res.first != arr1end) {
    std::cout << "Arrays not matching at " << std::distance(arrayone, res.first) << ", expected: " << *res.second << ", got: " << *res.first;
}
Run Code Online (Sandbox Code Playgroud)

更好的版本,前提是它arrayone是一种数组类型(如果您将其作为函数参数传递,它可能会衰减为指针).由于使用auto和,它需要C++ 11std::begin()

#include <algorithm>
#include <iterator>

int expectedResult[5] = {11, 12, 13, 14, 15};

auto res = std::mismatch(std::begin(arrayone), std:end(arrayone), std::begin(expectedResult));
if(res.first != std::end(arrayone)) {
    std::cout << "Arrays not matching at " << std::distance(arrayone, res.first) << ", expected: " << *res.second << ", got: " << *res.first;
}
Run Code Online (Sandbox Code Playgroud)

话虽这么说,我建议你选择一个框架并使用它.这些库是明确构建的,用于简化和快速进行单元测试(即上面的序列是GoogleTest中的一个线程,并且不容易出现不同的数组长度错误).

我也建议你不要使用普通的C风格数组.正如Ted Lyngmo所提到的,如果您使用标准容器,您可以使用更多选项(例如内置opearator ==),并且还可以为您管理资源.