资讯专栏INFORMATION COLUMN

测试数据之自动生成

tabalt / 3375人阅读

摘要:最近在学习排序算法的时候,需要利用程序自动生成测试数据,代码和思路整理在这篇文章里面。欢迎常来设计思路因为会被很多排序算法调用,所以,数据自动生成代码应该放在头文件中。

最近在学习排序算法的时候,需要利用程序自动生成测试数据,代码和思路整理在这篇文章里面。

文章图片来源于 GitHub,网速不佳的朋友请点我看原文。

顺便软广一下个人技术小站:https://godbmw.com。欢迎常来 ♪(^∇^*)

1. 设计思路

因为会被很多排序算法调用,所以,数据自动生成代码应该放在.h头文件中。为了防止命名冲突,函数被封装在“命名空间”中(代码中命名空间是: SortTestHelper)。

而对于排序来说,自动生成数据的类型需要有以下几种:

[a, b]范围内的n个随机数据,比如:1、2、100、-1...

n个近乎有序的数据,比如:1、2、3、7、5、6、4...

n个近乎相同的数据,比如:1、1、1、2、2、2、2、2...

除此之外,还需要数组浅拷贝、打印的函数,以及验证是否排序成功和测试排序时间的函数。

2. 用的知识点

srand(time(NULL))rand() : 设立随机种子,生成随机数

clock() : 用来算法运行前后的计算时钟周期差值,再除以CLOCKS_PER_SEC 即为运行秒数。

函数式编程 : 使用函数指针,方便调用和测试排序函数

其中rand()函数能生成 0 到MAX_INT之间的随机整数。如果想生成[0, n)之间的整数,需要取余操作:int x = rand() % n;;如果想生成[left, right]之间的整数,需要进行偏移:int x = rand() % (right - left + 1) + left;

3. 代码实现
//
// Created by GodBMW.com on 2018/9/11.
//

#ifndef BASESORT_SORTHELPER_H
#define BASESORT_SORTHELPER_H

#include 
#include 
#include 
#include 

using namespace std;

namespace SortTestHelper {
    // 生成[left, right]范围内n个随机数
    template 
    T* generateRandomArray(int n, int left, int right) {
        assert( left <= right );
        T *arr = new T[n];
        srand(time(NULL)); // set random seed
        for(int i = 0; i < n; i++) {
            arr[i] = rand() % (right - left + 1) + left;
        }
        return arr;
    }

    // 生成[0, n)范围内n个近乎有序的随机数
    template 
    T* generateNearlyOrderedArray(int n, int swap_times) {
        T *arr = new T[n];
        srand(time(NULL));
        // 先生成长度为n的有序数组
        for(int i = 0; i < n; i++) {
            arr[i] = i + 1;
        }
        // 随机选取其中2个数据,交换 swap_times 次
        for(int i = 0; i < swap_times; i++) {
            int pos_x = rand() % n;
            int pos_y = rand() % n;
            swap(arr[pos_x], arr[pos_y]);
        }
        return arr;
    }

    template 
    T* copyArray(T arr[], int length) {
      T* brr = new T[length]; // 注意检查brr数组大小
      copy(arr, arr + length, brr);
      return brr;
    }

    template 
    void printArray(T arr[], int length) {
        for(int i = 0; i < length; i++) {
            cout<< arr[i] << " ";
        }
        cout<< endl;
        return;
    }

    template 
    bool isSorted(T arr[], int length) {
        for(int i = 0; i < length-1; i++) {
            if(arr[i] > arr[i + 1]) {
                return false;
            }
        }
        return true;
    }

    // 第三个参数是函数指针,传入后,可以在本函数内运行被传入的函数
    template 
    void testSort(T arr[], int length, void(*sort)(T[], int), string name) {
        clock_t startTime = clock();
        sort(arr, length);
        clock_t endTime = clock();

        assert(isSorted(arr, length));
        cout << name << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " seconds" << endl;
        // endTime - startTime: 时钟周期
        return;
    }

}

#endif //BASESORT_SORTHELPER_H

我们没有实现第二部分所说的 生成n个近乎相同的数据,比如:1、1、1、2、2、2、2、2...。因为可以借助 generateRandomArray 函数,比如:SortTestHelper::generateRandomArray(10000, 0, 10)。生成[0,10]区间内 10000 个整数,那么不就是近乎相同的吗?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/8842.html

相关文章

  • 软件测试肖sir__软件测试介绍001测试分类(3)

    摘要:白盒测试白盒测试又称结构测试,透明测试,逻辑驱动测试,或基于代码的测试。 测试分类: 一、按开发阶段划分 1、单元测试 2、集成测试 3、系统测试 4、验收测试 二...

    szysky 评论0 收藏0
  • 测试开发系类接口自动测试

    摘要:接口定义代码角度的接口定义中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为功能。 接口定义 代码角度的接口Interface 定义:Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这...

    alexnevsky 评论0 收藏0
  • Postman接口自动测试——批量执行(集合操作)

    摘要:集合定义在接口自动化测试过程中将一组请求多条请求保存到一起进行集中管理。右上角有结果统计导出测试结果再次执行重新发起集合执行。 集合定义:在接口自动化测试过程中将一...

    tracymac7 评论0 收藏0
  • 移动测试中游戏和应用的不同

    摘要:今天就说说移动测试中最重要的两个方向。自动化测试完全不同于手游自动化测试手机和手游的开发技术不同,这导致了两者的自动化测试技术是截然不同的。手游和的第二个玩法不同在于探索性。 随着智能设备的普及和移动互联网的兴起,各家互联网巨头纷纷在往移动端布局和转型,同时初创的移动互联网公司也都盯着这个市场希望分一杯羹。在这个大环境下,互联网的重心已经慢慢从Web端转向了移动端,而移动端的软件测试也...

    Jinkey 评论0 收藏0

发表评论

0条评论

tabalt

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<