如何编写一段c++测试代码

如题,我是一位初学者,现有一道题如下:
编一段代码,分别实现插入排序,合并排序和快速排序的算法。然后编写测试代码,设计测试数据集,编写测试程序,测试正确性、算法复杂性和效率。

题目中注明检测正确性的测试程序应该输出一个遍历结果,保证所有分支语句都检测到。不太理解这是要我做什么……以及比较算法复杂性、效率,是需我明确地输出花费时间吗?

希望有大神可以在测试代码这方面指点迷津,谢谢!

"主要是你要准备足够充分的测试数据,这样才能保证代码的覆盖率。"
这种说法是不对的。测试就是要用尽可能少的测试用例,对代码做尽可能全面的测试。构造测试用例是一个需要技巧的工作。“充分、足够的数据”是一个模糊的概念,如果不加选择的使用大量测试数据,不但大大增加测试花费的时间,而且对于一些代码路径,仍然可能无法覆盖。

这里举一个例子:

 int foo(int x, int y, int z)
{
    if (z == 0)
        {
            x = 1;
                y = -1;
        }
    if (x > 0)
        {
            if (y > 0)
                {
                    return 1;
                }
                else
                {
                    return 2;
                }
        }
        else
        {
            if (y > 0)
                {
                    return 3;
                }
                else
                {
                    return 4;
                }
        }
}

对于这样一段代码,要想在测试中覆盖所有的代码路径,需要设计至少多少个测试用例?
答案是8种:
x y z
-1 -1 0
-1 1 0
1 -1 0
1 1 0
-1 -1 1
-1 1 1
1 -1 1
1 1 1

可见,覆盖所有代码路径就是,确保程序的所有分支的排列组合都尝试过。

现在再问你,要覆盖所有的代码分支,又需要多少测试用例?答案是5种
x y z
1 1 0
-1 -1 1
-1 1 1
1 -1 1
1 1 1
(当然答案不唯一)
可见,覆盖代码分支,就是确保代码中所有的分支都执行到。但是不覆盖全部的排列组合。

在真实情况下,覆盖所有路径往往是办不到的,因为程序大一些,那么分支组合的数量是天文数字。一般我们考察的是代码分支的覆盖率。在完备的测试中,要求100%覆盖所有的代码。
是不是覆盖了所有的路径(如果可能)就能确保程序正确?不一定,因为即便是同一个路径,也可能因为不同的测试数据,而造成不同的行为。

所以,构造测试用例是一个非常有技巧的事情。测试者必须根据他的经验,尽可能测试到极端的、临界的条件,将从概率上很低发生但是可能导致程序出错的条件提取出来。

排序算法是代码比较多,测试代码其实应该是要写一些测试用例,比如数组12345678就是一个用例
8大排序算法:
http://blog.csdn.net/wangyaninglm/article/details/44805715

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TRUE 1
#define FALSE 0
#define MAX 10000

typedef int KeyType;
typedef int OtherType;

typedef struct
{
    KeyType key;
    OtherType other_data;
}RecordType;


// All kinds of seek.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "headfile.h"
#include "windows.h"
#include  "conio.h "

#include"WinBase.h"
#include "Psapi.h"

#pragma  once
#pragma  message("Psapi.h --> Linking with Psapi.lib")
#pragma  comment(lib,"Psapi.lib")


int Data[MAX]={0};

void produceData(int a[],int length)       //给数组生成数据,用于随即查找
{
    time_t t;
    srand(time(&t));
    for (int i=0;i<length;i++)
    {
        a[i]=rand()%length;
    }


}

void printData(int a[],int length)      //打印数字,到控制台,每五个换一行
{
    for (int i=0;i<length;i++)
    {
        printf("%8d",a[i]);
        if (0==i%5)
        {
            printf("\n");
        }
    }

}

double showMemoryInfo()   
{   

    double MemorySize;                  //单位MB
    HANDLE handle=GetCurrentProcess();   

    PROCESS_MEMORY_COUNTERS pmc;   
    GetProcessMemoryInfo(handle,&pmc,sizeof(pmc)); 
    MemorySize=pmc.WorkingSetSize/1024;

    printf("内存使用:  %8lf \n",MemorySize);    //WorkingSetSize The current working set size, in bytes.

    return MemorySize;

} 

void writeRecordtime(unsigned rTime)//将程序结果运行时间写入文件
{
    FILE *fpRecord=NULL; 

    char *s="your programm running time is:   ";
    char *c="ms   ";

    if((fpRecord=fopen("record.txt","wt+"))==NULL) 

    { 

        printf("Cannot open file strike any key exit!"); 

        getchar(); 

        exit(1); 

    } 

    fprintf( fpRecord, "%s", s);
    fprintf( fpRecord, "%d", rTime);
    fprintf( fpRecord, "%s", c);

    fprintf( fpRecord, "\n");
    fprintf( fpRecord, "your programm use %fMB size of memory!!!", showMemoryInfo());



    fclose(fpRecord); 


}





int _tmain(int argc, _TCHAR* argv[])
{
    produceData(Data,MAX);
    printData(Data,MAX);

    getchar();

    return 0;
}


主要是你要准备足够充分的测试数据,这样才能保证代码的覆盖率。

主要是几件事:
1、实现测试代码,需要打印输入和输出,同时判定输出结果是否正确,都要在测试代码中完成;

2、需要统计代码效率,实际就是执行时间。

3、设计测试用例,通过用例达到分支覆盖,这个查查测试网上用例设计方法。

不过不知道你是面试还是工作用,工作中的话覆盖情况可以通过工具进行统计的,可以明确看到通过用例执行,具体的用例覆盖情况。