b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

hashmap的实现原理_oop思想_oop原则(2)

电脑杂谈  发布时间:2017-01-23 23:13:54  来源:网络整理

图2,OOP对象的一元结构

相应的,OOP程序的单元测试也以对象的行为验证为主。行为验证(Behavior Verification)是指从类型规范出发,通过一个场景验证对象行为符合类型规范。比如:对于堆栈,其类型规范即FILO,那么行为验证就是要构造一个场景,检验堆栈对象的push和pop方法符合FILO规范。下面是用C++语言实现的基于行为验证的单元测试:

//C++

void test_FILO(){

Stack stack;

int input1 = 1;

int input2 = 2;

push(stack, input1);

push(stack, input2);

int output1 = stack.pop();

ASSERT_EQUAL(output1, input2); /* 检查FILO*/

int output2 = stack.pop();

ASSERT_EQUAL(output2, input1); /*检查FILO*/

}

编写行为验证测试用例的首要条件是理解类型规范,一般来讲类型规范应包括几个方面:1.各个方法的Precondition和Postcondition,例如:输入参数值为[0, 1000),返回值不为NULL;2.类的Invariant,例如:儿童的年龄属性小于18;3.类各方法的关系不变式,例如:堆栈的FILO;4.类与外部类的交互关系,例如:Socket发生错误的时候向外界发出事件。这些都属于在行为验证中应该检查的。

状态验证 vs 行为验证

状态验证侧重于检验函数对数据状态的改变,更加靠近实现,是一种基于内部状态的白盒测试;行为验证侧重于检验对象的外部行为,更加靠近需求,是一种基于外部接口的黑盒测试。从重构的角度看,二者也有显著的不同:状态验证和具体实现是紧密相关的,在需求不变的情况下,重构实现很可能会使原有的测试用例失效;而行为验证和具体实现没有关系,在需求不变的情况下,重构实现不会使原有测试用例失效,而且还能利用原有测试用例作为回归测试,防止重构过程引入bug。在实际的软件开发中,尤其是采用OOP开发的情况下,我们提倡采用行为验证。不过,状态验证也有用武之地,有时为了构造一个不易出现的程序状态,通过状态验证可以轻易实现,而通过行为验证则很难写出相应的场景。这是由白盒和黑盒测试的差别所决定的,白盒测试好比,黑盒测试好比吃药,各有适用的场景。

过程式语言可以做行为验证吗?

oop思想_oop原则_hashmap的实现原理

答案是肯定的!其实,C++/Java/C#提供的class仅仅是一种语法手段,如果真正理解了数据抽象思想,用C语言同样可以做行为验证:

/*C语言*/

void test_FILO(){

Stack *pStack = create_stack();

push(pStack, 1);

push(pStack, 2);

int item2 = pop(pStack));

ASSERT_EQUAL(2, item2); /*检查FILO*/

int item1 = pop(pStack);

ASSERT_EQUAL(1, item2); /*检查FILO*/

}

在过程式语言中做行为验证的要点在于:忽略数据,重视函数间的关系!

OOP语言可以做状态验证吗?

答案也是肯定的!不过,需要三思而后行。很多时候,OOP语言中出现状态验证并非有意为之,而是程序员没有理解数据抽象思想,虽然在用OOP语言,但本质上还是在写过程式程序。下面的程序就是典型:

//C++

void test_push(){

std::vector<int> items;

Stack stack(items); //构造函数依赖注入

stack.push(1);

ASSERT_EQUAL(1, items[0]);//检查状态

}

有一个简单的办法来提醒我们检查是不是在用OOP语言写过程式代码:如果对象的行为依赖于其它对象的状态,那么就应该审视一下是不是破坏了封装滑落到了过程式设计。上面的例子中,stack对象的状态是由一个vector对象来保管的,stack的push/pop行为显然依赖于其它对象的状态,这时我们就应该回过头来检查自己的设计是不是有问题。

本文介绍了状态验证和行为验证两种单元测试的基本方式,以及背后的过程式和OO程序设计思想。本文所讲的状态验证/行为验证与Martin Fowler文章Mocks Aren’t Stubs中的State Verification/Behavior Verification所强调的方面并不完全相同,读者可进行比较。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28378-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    每日福利
    热点图片
    拼命载入中...