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

时间:2019-01-17 18:12:59

标签: c++ arrays testing

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

为了描述这一点,从本质上讲,我希望验证例如

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

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

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

3 个答案:

答案 0 :(得分:5)

使用C ++ Sub aver() With Worksheets("Sheet4") 'Change to your sheet Dim lastrw As Long lastrw = .Cells(.Rows.Count, 3).End(xlUp).Row Dim num() As Variant ReDim num(1 To lastrw) As Variant Dim i As Long For i = 4 To lastrw Dim j As Long j = Application.Match(1E+99, Rows(i), 1) num(i) = .Cells(i, j).Value Next i .Range("O1").Value = Application.Average(num) End With End Sub 代替,您将从其公开的所有方法中受益,例如std::array

operator==

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

#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";
    }
}

答案 1 :(得分:5)

std::mismatch()将完成工作并提供比std::equal更多的信息。如果将auto更改为std::pair<int*, int*>

,这将适用于C ++ 11之前的编译器。
#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;
}

更好的版本,前提是arrayone是数组类型(例如,如果您将其作为函数参数传递,则可以decay to a pointer)。由于使用autostd::begin()

,因此需要C ++ 11
#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;
}

话虽如此,我建议您选择一个框架并使用它。这些库是专门为使单元测试变得容易和快速而构建的(即上面的序列是GoogleTest中的一个衬里,并且不容易出现不同的数组长度错误)。

我还建议您不要使用纯C样式的数组。如Ted Lyngmo所述,如果您使用标准容器,则可以使用更多选项(例如内置opearator ==),它们还会为您管理资源。

答案 2 :(得分:1)

如果坚持不使用STL和使用原语,那么这几乎是一个C问题,因为它没有使用C ++功能。如果可以放心地假设它们的大小为 n ,则应该可以进行以下操作。

给出两个大小为n的原始整数数组,一般实现为

bool equal(int *arr1, int *arr2, int n) { 
    for (int i = 0; i < n; i++) {
        if arr1[i] != arr2[i] return false;
    }
    return true
}

尽管总的来说,std :: array比旧的C样式数组更好,但是我对这个问题的理解还不清楚,如果可以使用STL,那么其他解决方案就更好了。

编辑:如果不清楚上述解决方案存在哪些问题,则为

  • 没有指针验证
  • 如果数组的大小不同,这将无法工作
  • 如果要验证非整数数组,则需要另一个(公认的)函数
  • (主观)输出时间因两个数组的相似程度而异

如果您想要更好的解决方案,请使用memcmp,如注释中建议的那样(据我所知,这并没有使用库):

对于类型为 X 且大小为 n 的两个数组,您可以简单地说

bool eql = !(memcmp(arr1, arr2, n*sizeof(X))