Presentation is loading. Please wait.

Presentation is loading. Please wait.

2017/3/17 第七课 带上X光眼镜检查软件-续.

Similar presentations


Presentation on theme: "2017/3/17 第七课 带上X光眼镜检查软件-续."— Presentation transcript:

1 2017/3/17 第七课 带上X光眼镜检查软件-续

2 本节课内容 学习Junit的一个扩展包 – JFCUnit 学习一个单元测试工具 – PurifyPlus

3 上堂课讲过Junit在许多方面都有人做扩展, 在图形界面的程序测试方面, 就有一个扩展包叫JFCUnit
获得它, 可以到 或者在ftp:// /软件测试/JFCUnit下

4 图形界面的测试 测试用例的编写: 图形界面程序的用例编写, 主要是针对界面上的元素, 做不同的操作, 看其是否得到预期结果.
有时候操作组合是相当庞大的. 我们可以针对正常的操作流做测试用例. 然后做一些非正常数据. 甚至象愚笨用户一样乱使用, 看程序状态.

5 想过这样的测试过程, 用工具来模拟吗?

6 JFCUnit原理 Obtaining handles on Windows/Dialogs opened by the Java code. Locating components within a component hierarchy that occur within the containers found above. Raising events on the found components, e.g. clicking a button, typing text in a TextComponent. Handling testing of components in a thread safe manner.

7 图形编程原理 图形编程的原理, Java每个窗口在Windows操作系统中都有handler(柄), 窗口上每个图形元素是按照树形结构层层排列的, 比如button, label, textfield, menu等, 都有自己的handler(柄). 针对它们的行为, 比如说点一个button, 在一个元素上移动鼠标, 都作为一个事件发送给相应的这些元素或者包含它们的组件 (比如窗口, panel等)来处理.

8 看图形编程 LoginScreen.java
                                       

9 JFCUnit做什么 为了模仿用户交互的过程, JFCUnit提供对各种图形界面的交互操作, 然后经过操作以后, 看程序的状态, 来验证程序是否符合需求. 例如: 一个LoginScreen, 里面有loginName, password, 还有两个button. 你可以用程序, 模仿任何一种动作, 比如在没有输入任何内容的时候, 点‘enter’按钮, 程序应该反映在该窗口上“Login Error”.

10 象这样的程序, 由JFCUnit怎么编写呢? 看程序 LoginScreenTest.java

11 JFCUnit使用 可以在Eclipse平台上用
建立一个项目, 在项目的‘build path’上选择‘add external archives’, 选择添加 jfcunit.jar jakarta-regexp-1.2.jar 是两个包都要, 否则, 编译不通过

12 从这里, 你能够看出来, JFCUnit是可以模仿各种event(事件), 以达到和界面交互,然后验证程序状态.

13 下面看看JFCUnit有哪些类, 都做了什么事情.

14 Finder 找寻相应的图形元素(component). Finder在找的时候, 可以根据图形元素名字, 特性来找.
针对不同的各种图形元素, 有不同的Finder, 原理是不同的图形元素的组成不同, Finder在寻找的时候, 获得参数, 按照参数去过滤图形元素, 从而找到它们.

15 例如 JLabelFinder lfinder = new JLabelFinder(“Login Name”); lfinder.findAll(); 这里设一个找Label内容是“Login Name”的Finder, 然后调用findAll(), 找寻所有的这样的Label.

16 Helper 它发事件给事件对象, 工作过程是产生一个事件, 然后把事件发到事件队列, 由相应的AWT的事件处理线程读取, 处理.
JFCUnit有两种Helper. Firing events on the EventQueue using the junit.extensions.jfcunit.JFCTestHelper Wrapping java.awt.Robot using the junit.extensions.jfcunit.RobotTestHelper

17 例如: getHelper().enterClickAndLeave( new MouseEventData( this, enterButton ) );

18 JFCUnit测试程序和AWT线程的关系
带Swing的图形程序 发派事件 AWT 线程 取事件 事件队列 JFCUnit测试 正常用户交互产生的事件

19 JFCUnit所模仿的事件 鼠标事件 键盘事件 滚轮事件 针对不同的图形元素, 还有它们自己的事件类, 可以用来构造事件

20 另一个例子                                                                                                                                                                                                                     Figure 1

21 当用户选了CopyText按钮, 上面的textfield中的内容会被copy到下面的textfield中, 写一个测试程序, 看这过程是否正确完成.
当用户选中了TreeListTab的时候, 选中“Autobots”, 就能看到List中有变化. 看程序如何自动实现的.

22 程序在 /第九课代码/jfcUnitDemo/下有该界面的实现程序.
在/第九课代码/jfcUnitTest/下有相应的测试程序.

23 JFCunit的原理, 是用程序模仿用户交互过程, 进行测试.
有同学对JFCUnit感兴趣的, 可以自己查看相应的API, 在老师给的JFCUnit的包中,有相应的描述API.

24 还有一些图形界面程序的工具, 例如Rational Robot, 它有录制Window下用户操作的功能, 不论是C++, 还是Java程序编写的, 只要是窗口界面, 它都能做.
把用户的动作录制成脚本, 允许用户脚本中增加或者修改(或者就是保留原样), 然后在以后的测试中回放, 以后我们会介绍该工具.

25 讨论人工进行图形界面程序测试和使用这样的工具测试的不同, 各有什么特点?
- 使用工具, 测试用例可记载,可重复,执行的时候bug容易跟踪. 但是编写程序非常繁重, 同时学习工具和使用工具也要有过程. - 人工, 几乎稍微训练就能做. 不容易记录, 有时候做过了, 找到bug了, 但是下次忘记操作过程了, 不利于回归测试.

26 单元测试的系列测试工具 单元测试这个系列测试工具非常丰富, 例如测试网站程序的HttpUnit, 测试XML的XMLUnit,等.
相应不同语言(C++, .Net)都有自己相对应工具. 我们希望通过Junit, JFCUnit的学习,让同学了解单元测试工具的设计思想,使用方法.

27 学习PurifyPlus 该工具是Rational系列产品之一,主要用在单元测试方面. PurifyPlus几个组成部分:
 pureCoverage:检查代码覆盖,还用于监测运行时的线程状态 Quantify: 性能测试的工具

28 什么是内存泄露 C++内存泄露 (容易出现) Java内存泄露 (有Garbage Collector, 好象不那么明显)
注意:不论是哪种泄露, 都是程序人员的责任.

29 C++内存泄露 Circle *myc; …. myc = new Circle(….); …..
myc = 0; //注意这里没有调用 //delete(myc), 而把指针给清了. 这个时//候myc原来指的对象还在内存中, 就是//一个泄露.是程序人员错误

30 Java内存管理 在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外)
对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作 GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。执行效率不如C++.

31 Java的GC针对对象引用画有向图,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。
每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。 在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。

32 针对引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。
这种方式的优点是管理内存的精度很高,但是效率较低。 另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。

33 Java内存泄露 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点:
-首先,这些对象是可达的,即在有向图中,存在通路可以与其相连; -其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

34 Java内存泄露例子 Vector v=new Vector(100); for (int i=1;i<100; i++) { Object o=new Object(); v.add(o); ……… //代码在这里做了一些操作 o=null; //程序人员想释放该对象了, //以为这样就可以了. }

35 例子解释 我们仅仅释放o引用本身,那么v仍然引用该对象,所以这个对象对GC来说是不可回收的。
解决方法是如果对象加入到v后,还必须从v中删除,最简单的方法就是将Vector对象设置为null。 注意: 该错误是程序员错误

36 从例子知道在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语言上保证,任何对象都是可达的,所有的不可达对象都由GC管理。

37 Memory leak: C++ vs. Java
                                                                                                                                                                                      

38 内存泄露方面的工具 Rational Purify Optimizeit Profiler JProbe Profiler等

39 检查内存泄露工作原理 堆视角。这是一个全面的视角,我们可以了解堆中的所有的对象信息(数量和种类),并进行统计、排序,过滤。了解相关对象的变化情况。 方法视角。通过方法视角,我们可以得知每一种类的对象,都分配在哪些方法中,以及它们的数量。 对象视角。给定一个对象,通过对象视角,我们可以显示它的所有出引用和入引用对象,我们可以了解这个对象的所有引用关系。 引用图。给定一个根,通过引用图,我们可以显示从该顶点出发的所有出引用。

40 在运行过程中,我们可以随时观察内存的使用情况,通过这种方式,我们可以很快找到那些长期不被释放,并且不再使用的对象。我们通过检查这些对象的生存周期,确认其是否为内存泄露。
在实践当中,寻找内存泄露是一件非常麻烦的事情,它需要程序员对整个程序的代码比较清楚,并且需要丰富的调试经验,但是这个过程对于很多关键的Java程序都是十分重要的。

41 我们实验将用Purify工具, 测试一两个例子, 看其效果.

42 下节课我们将继续介绍 代码覆盖工具 Pure Coverage, 集成测试注意事项 项目管理工具 CVS

43 课堂练习(看时间,可以选4题) 学习了测试, 现在你认为该工作主要是干什么的, 你有兴趣在这领域发展吗?
测试中有哪些原则, 说出几个. 根据自己测试的经验, 你认可这些原则吗? 你认可软件工程的许多说法吗? 认可测试也需要工程化吗, 也应该做规范化, 文档化, 测试代码也需要一定的规范吗? 谈谈想法.

44 在面向对象测试中, 一个父类A, 一个子类B, B继承A, 使用Junit, 通常怎样开发测试类?
测试中的覆盖都有哪些, 能说出几个吗? 覆盖率主要是干什么用的. 单元白盒测试主要强调哪些方面?


Download ppt "2017/3/17 第七课 带上X光眼镜检查软件-续."

Similar presentations


Ads by Google