面向对象的编程-Application 29

Previously on OOP:

GUI is composed of three parts: Model, View and Controller. The first part is the same as the programs made in previous chapters. The second part specifies how to draw components in a window. And the third part is responsible for adding listeners to View components.

Slide 1

刚进大学的时候,有的宝宝一看到编译器没有报错,就要开一瓶香槟,一直庆祝到晚上12点。后来才知道庆祝得太早了,因为编译过了,不代表运行也能通能过。而且所谓运行通过,指的不是运行中没有出现任何Exception打断程序的运行,而是程序运行的结果是符合requirements and exception的。

以上文的GUI代码为例,需求是实现一个计数器,可以做加减法,那么运行出来的结果就不能是只可以加不可以减。

为了保证运行的正确,测试是一个必不可少的环节。测试分有很多种,有功能性的测试,可用性的测试,有黑盒测试,白盒测试,等等。在本课程中会使用教授编写test cases来测试。如果考试结束后,执行所有的test cases全部通过,那么恭喜宝宝了,妥妥地满分。本黄鸭还需要强调以下两点:

(1)Test cases是老师编写的,所以学习的重点应该在test cases怎么运行,最好还能看懂一些test cases。

(2)运行test cases的前提是程序能够编译,所以编译不通过的都会被直接判定为挂掉了考试。

Slide 2

Test case由三个部分组成,如本页PPT所示。第一部分是input,描述在XXX情况下。第二部分是expected response,即预想会触发什么样的剧情。第三部分说明这个test case存在的意义,是为了证明哪一个功能而存在的。

Slide 3

在证明数学定理时,想要证明正确,就要证明方方面面都正确;想要证明错误,只需要举一个反例。在程序测试中也是一样的,证明正确就必须要把代码可能出现的所有排列组合全部测试一遍。

然而,所有的排列组合加在一起可能根本测不完,这时,我们就要对test case有所划分和取舍。本页PPT中显示了一些优秀test cases的标准,本黄鸭还有两点需要补充:

(1)A功能与B功能之间没有联系,那么就可以分开测试;反之,就要先分开测试,再联合起来一起测试。

(2)尽量多花时间测用户日常都会用到的功能,而不是corner cases。

Slide 4

JUnit是本课程中写test cases的一种framework。它在测试中的类别属于unit test,下面是unit test的定义:

对于软件开发来说,unit test是非常重要的,最好在每次代码提交之后都跑一遍,以保证新提交进来的代码不会影响到之前的类。

Slide 5

本页PPT的重要程度是100颗五角星,因为里面描述了:

(1)怎样把编写好的JUnit test package加入到project中

(2)怎样创建新的JUnit test package

(3)Test cases of JUnit的原理是调用某一个类中的(几个)函数,给一些passing arguments,然后观察运行的结果是否和expected result一样。

Slide 6

判定运行结果和expected result是否一样,需要用到assertX()函数。需要特别注意的是assertFalse()函数,当调用类的函数运行结果是false的时候,测试才能通过。

当assertX()函数的测试结果为fail的时候,测试的程序会停止运行。哪怕是被测试的类的后面还有函数是过的,也会显示为fail,因为test case的程序不会执行到后面的函数。所以在考试中,各位宝宝们如果来不及做完,就把后面会做的先做了是没有用的,一定要按照题目的顺序来做。

Slide 7

Test cases中不一定有main函数,也没有规定必须从main函数开始执行,而是所有的以“test”开头的public函数都会被依次执行一遍。

Slide 8

本页PPT中是JUnit test cases中一些常用的methods。各位宝宝们只要稍微了解一下即可,不需要会使用。

下面是一段针对前面一篇文章中GUI的代码的test case:

在TestCounter类中没有main函数,所以我们就从以“test”开头的public函数开始执行,也就是testOneIncrement()函数。

先创建Model,View,Controller的实例,然后用doClick()函数模拟用户在界面上点击incrementbutton的事件。在真实场景下,用户应该会move the mouse, click the button, and release,但是现在这些不太重要的动作都被去除了,在test case中只留下click。

最后取得JLabel的字符串的值,用assertX()函数判定是否被更新为“1 Duck(s) are Covening!”,如果是,那么这个test case就通过了。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181105G1DDA900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券