软件测试

---恢复内容开始---

  近期学习了软件工程中的软件测试模块,了解了一些被自己熟知而又容易忽略的知识,初识语言时,我们在设计程序时默认的使用者为开发者,在潜意识过程中缩小了用户的适用范围,造成了编写的程序交互性下降,这也涉及个人编程修养的养成,拥有良好的编程修养,即可大大降低诸如此类问题,使应用程序更加健壮,“码如其人”,给它一个完整的生命吧!

  介绍一下了解的单元测试,单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致使用单元测试这个简单有效的技术就是为了令代码变得更加完美。如此针对代码小模块的编写代码是非常有帮助的,它可以保证这部分代码试运行正确的,他的功能可以实现。当进行程序链接的时候,程序运行出现了bug,可以排除bug不是出现在增加模块的内部。

  还有值得一提的是程序运行跳出bug,往往会出现在人机交互,举个例子,要求输入一个整型的数据,用户误输入为其他类型,程序很有可能会出现错误,诸如此类问题。事件的发生有突发性,所以需要一个维护机制,保证程序的正常运行。

 下面是常用的R-BICEP模式测试法:

Right-结果是否正确?

如果代码能够运行正确,我要怎么才知道他是正确的呢?至少需要确认代码所做的和你的期望是一致的。使用数据文件对于有大量测试数据

的测试,考虑使用一个独立的数据文件来存储这些测试数据,然后单元测试读取该文件。对于验证被测方法是正确的这件事情,如果某些做

法能够使它变得更加容易,那就采纳它吧。

B-是否所有的边界条件都是正确的?

一个想到可能的边界条件的简单办法就是记住助记短语CORRECT。

Conformance(一致性):值是否和预期的一致

Ordering(顺序性):值是否如应该的那样,是有序或者无序的

Range(区间性):值是否位于合理的最小值和最大值之间

Reference(依赖性):代码是否引用了一些不在代码本身控制范围内的外部资源

Existence(存在性):值是否存在(是否非null,非0,在一个集合中等)

Cardinatity(基数性):是否恰好有足够的值

Time(绝对或者相对的时间性):所有的事情的发生是否是有序的?是否是在正确的时刻?是否恰好及时?

I-能查一下反向关联吗?

对于某些方法,可以使用反向的逻辑关系来验证他们。用对结果进行平方的方式来检查一个计算平方根的方法,然后测试结果是否和原数据

很接近为了检查某条记录是否成功插入了数据库,你可以通过查询这条记录来验证。

C-能用其他手段交叉检查一下结果吗?

计算一个量会存在一个以上的方法。可以利用另一个方法来交叉测试原方法的结果。使用类本身不同组成部分的数据来进行交叉检查。如图

书馆的数据系统,可以通过借出数和库存数之和必定等于所藏书籍总量这种约束来进行检查。

E-你是否可以强制错误条件发生?

真实世界中出现的错误:磁盘满,网络断等,可以利用Mock对象环境方面的约束的考虑:系统过载、内存耗光等

P-是否满足性能要求?

要检查的是性能特性,而不是性能本身。性能特性有着“随着输入尺寸慢慢变大,问题慢慢变复杂”的趋势性能特性的快速回归测试由于测

试时间较长,可以考虑每隔几天运行一次需要使用一些测试工具

下面以上篇文章的程序为基础,进行一个小模块的测试:

 

根据提示“请输入选择”,即选择你选择的操作,例如你选择1,即输入“1”

 

此为选项1的正确意图,确定出题的数量。而这一切都是按照我们的意愿发生的,我们像上帝一样操作着一切。在第一次输入选择时,用户很有可能输入超过4的值,或非数值类型数据等情况。看一下截图:

 

输入5之后程序进入了未反应状态(后续称之为N状态),任何操作都没有效果,只能关闭程序,重新启动。代码如下:

void menu1()

{

    cout<<"- - - - -  - - - - - - 菜单- - - - - - -- - - - - - "<<endl;

    cout<<"                   1.定制出题数量                   "<<endl;

    cout<<"                   2.定制打印                       "<<endl;                 //附加功能??

    cout<<"                   3.退出菜单                       "<<endl;

    cout<<"                   4.使用说明                       "<<endl;

    cout<<"- - - - -  - - ---------------二柱子- "<<endl;

}

void choice(int *n)

{

    int choi,number;

    menu1();

    cout<<"请输入选择"<<endl;

    cin>>choi;

    while(choi!=3)

    {

        switch(choi)

        {

        case 1:

            {

                cout<<"请输入题目数量"<<endl;

                cin>>number;

                *n=number;

                menu1();

                cin>>choi;

                break;

            }

        case 2:

            {

                cout<<"定制打印"<<endl;

                menu1();

                cin>>choi;

                break;

            }

        case 4:

            {

                cout<<" 使用说明书"<<endl;

                menu1();

                cin>>choi;

                break;

            }

           

        }

    }

}

下面对程序做一下改进:

void choice(int *n)

{

    int choi,number;

    menu1();

    cout<<"请输入选择"<<endl;

    cin>>choi;

    while(choi!=3)

    {

        switch(choi)

        {

        case 1:

            {

                cout<<"请输入题目数量"<<endl;

                cin>>number;

                *n=number;

                menu1();

                cin>>choi;

                break;

            }

        case 2:

            {

                cout<<"定制打印"<<endl;

                menu1();

                cin>>choi;

                break;

            }

        case 4:

            {

                cout<<" 使用说明书"<<endl;

                menu1();

                cin>>choi;

                break;

            }

        default:

            {

                cout<<"输入数据不符合要求!"<<endl;

                menu1();

                cin>>choi;

                break;

            }

        }

    }

}

再次运行程序做相应操作,观察结果

 

Best day of my life!

有关链接:http://blog.csdn.net/onlyonename/article/details/8316533

---恢复内容结束---

原文地址:https://www.cnblogs.com/zZ-ily/p/4342903.html