27_Unit_Test_NoPass

0

No comments posted yet

Comments

Slide 10

考试大纲

Slide 1

Copyright by Huang Hui @2004-2009 1 http://blog.csdn.net/hhmoll/ hhmall@hotmail.com 2007-11-13 Created 2007-11-18 Version 2007 2009-05-25 Last Updated 单元测试

Slide 2

Copyright by Huang Hui @2004-2009 2 内容 单元测试 极限编程 JUnit 测试系统 测试系统结构 测试用例 自动化测试

Slide 3

Copyright by Huang Hui @2004-2009 3 极限编程(Extreme Programming) XP is a lightweight methodology for small to medium sized teams developing software in the face of vague or rapidly changing requirements. -- Kent Beck. XP是勇气,交流,反馈和简单。 XP是软件开发过程中的纪律,它规定你:必须在编程前测试,必须两个人一起编程,必须遵守编程规范……。 XP是把最好的实践经验提取出来,形成了一个崭新的开发方法。

Slide 4

Copyright by Huang Hui @2004-2009 4 为什么需要XP

Slide 5

Copyright by Huang Hui @2004-2009 5 为什么需要XP

Slide 6

Copyright by Huang Hui @2004-2009 6 公司: 1) 培养团队合作精神,稳定开发队伍; 2) 提高开发人员的水平; 3) 提高项目成功率,降低开发成本。 项目经理: 1) 更好地和用户沟通,更清晰地理解用户需求; 2) 更充分地使用资源,更科学地调配资源,更精确地掌握开发进度。 Team Lead和Architect: 1) 设计更加完善; 2) 更有效地更新知识,得到其他成员更多的尊重。 程序员: 1) 学习系统设计和项目管理; 2) 提高学习和工作效率,受到重视,减少加班时间。 为什么需要XP

Slide 7

Copyright by Huang Hui @2004-2009 7 谁在用XP Fortune 500 公司中成功应用XP的公司包括Ford,Daimler-Chrysler,First Union National Bank,IBM,HP等等。 2-10人的小规模开发队伍(小规模开发队伍 小规模项目)。 越来越多的公司开始使用敏捷开发过程,或者将其与RUP等开发过程结合使用。

Slide 8

Copyright by Huang Hui @2004-2009 8 程序员进行的是有创造性的脑力活动 — 以人为本 Open Source的启示 — 更好的Code Review和测试 对设计过程的重新思考 — 传统设计的缺陷 — 编程中的设计和编程外的设计 开发过程应该更多地面向代码而不是文档 — 轻量级 增量开发的趋势 — 迭代越来越频繁 新方法有Crystal,Scrum,XP等 — XP结合“纪律性”和“适配性”,发展得最好 软工革命 — Agile Process

Slide 9

Copyright by Huang Hui @2004-2009 9 XP的增量过程

Slide 10

Copyright by Huang Hui @2004-2009 10 测试驱动开发

Slide 11

Copyright by Huang Hui @2004-2009 11 什么是Refactoring Refactoring是对已经完成的代码进行改进的过程。 在不对代码的外部行为进行改动的情况下,对代码内部的结构进行优化。 Refactoring 是严谨地对完成的代码进行清理的从而减少出错的一种方法。 Refactoring 的实质是对完成代码的设计进行改进。 Refactoring 是XP项目中每天的例行练习。 Refactoring 必须和Test-Driven Design and Development伴随进行。

Slide 12

Copyright by Huang Hui @2004-2009 12 Refactoring的流程 读懂代码(包括测试例子代码) Refactoring 运行所有的Unit Tests

Slide 13

Copyright by Huang Hui @2004-2009 13 程序员的一天

Slide 14

Copyright by Huang Hui @2004-2009 14 什么是Test-Driven Design (TDD) Test-Driven Design是一种开发风格,它要求程序员做到: 在写产品代码之前,先写它的单元测试( Unit Tests ) 没有单元测试的Class不允许作为产品代码 单元测试例子决定了如何写产品代码 不断地成功运行所有的单元测试例子 不断的完善单元测试例子 Test-Driven Design是把需求分析,设计,质量控制量化的过程!

Slide 15

Copyright by Huang Hui @2004-2009 15 什么是Test-Driven Design (TDD) Test-Driven Design是一种开发风格,它要求程序员做到: 在写产品代码之前,先写它的单元测试( Unit Tests ) 没有单元测试的Class不允许作为产品代码 单元测试例子决定了如何写产品代码 不断地成功运行所有的单元测试例子 不断的完善单元测试例子 Test-Driven Design是把需求分析,设计,质量控制量化的过程!

Slide 16

Copyright by Huang Hui @2004-2009 16 越早发现错误越好 调试代价昂贵 定位和修复错误是非常困难和耗时 调试对80%的软件项目延期有直接责任 Microsoft所做的研究表明发现和改正一个编程错误平均需要12个小时 有研究表明每千行代码平均有6个错误 处理软件缺陷的正确方法是在第一时间防止错误进入代码

Slide 17

Copyright by Huang Hui @2004-2009 17 单元测试 检验程序最小单位有无错误。 一般在编码之后,由开发人员完成。 实施效果非常好,但是实施阻力比较大 “不可能出问题” “小子,我的代码肯定没错” “天,我这是怎么了,如此简单的错误” “以后绝对不可能了”

Slide 18

Copyright by Huang Hui @2004-2009 18 借口 - No 1 写测试代码太耗时间

Slide 19

Copyright by Huang Hui @2004-2009 19 借口 运行测试太花时间了 单元测试运行飞快 写测试代码不是我的工作 你的任务是写可用的代码 如果你的代码总出问题,你的名声就不好了 我让QA没事做不太好意思吧 QA还有很多测试要做 公司不让我在实际的系统上运行测试代码 单元测试,在你的开发环境下进行

Slide 20

Copyright by Huang Hui @2004-2009 20 xUnit xUnit.NET (NUnit, for Microsoft .NET) CUnit CppUnit DephiUnit PerlUnit PhpUnit RubyTestUnit http://c2.com/cgi/wiki?TestingFramework

Slide 21

Copyright by Huang Hui @2004-2009 21 JUnit 的定位 Junit是由kent Beck和Erich Gamma 编写的一个open source的测试框架,用来编写可重复的测试例子。

Slide 22

Copyright by Huang Hui @2004-2009 22 检测方法 – assertEquals public void assertEquals(int a, int b) { assertTrue(a == b); }

Slide 23

Copyright by Huang Hui @2004-2009 23 计划测试 测试以下函数 int Largest.largest(int[] list); 返回集合中最大的整数 例如[9,8,7] 返回9 考虑其他情况 [9,8,7]  9 … … … …

Slide 24

Copyright by Huang Hui @2004-2009 24 测试用例 [9,8,7]  9 [8,9,7]  9 [7,8,9]  9 [7,9,8,9]  9 [1]  1 [-9,-8,-7]  -7 [] null

Slide 25

Copyright by Huang Hui @2004-2009 25 步骤 Foo

Slide 26

Copyright by Huang Hui @2004-2009 26 Largest.java public class Largest { public static int largest(int[] list) { int index, max=Integer.MAX_VALUE; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } }

Slide 27

Copyright by Huang Hui @2004-2009 27 TestLargest.java import junit.framework.*; public class TestLargest extends TestCase { public TestLargest(String name) { super(name); } public void testSimple() { assertEquals(9, Largest.largest(new int[] {9,8,7})); } }

Slide 28

Copyright by Huang Hui @2004-2009 28 JUnit – Download

Slide 29

Copyright by Huang Hui @2004-2009 29 JUnit配置 正确设置JDK环境 正确设置CLASSPATH环境 包含junit.jar 运行 java junit.swingui.TestRunner java junit.textui.TestRunner classname ...

Slide 30

Copyright by Huang Hui @2004-2009 30 运行测试 - 1 C:\QA\Tools\JUnit\Examples>javac *.java C:\QA\Tools\JUnit\Examples>java junit.textui.TestRunner TestLargest .F Time: 0 There was 1 failure: 1) testSimple(TestLargest)junit.framework.AssertionFailedError: expected:<9> but was:<2147483647> at TestLargest.testSimple(TestLargest.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) FAILURES!!! Tests run: 1, Failures: 1, Errors: 0

Slide 31

Copyright by Huang Hui @2004-2009 31 晕,可能吗! public class Largest { public static int largest(int[] list) { int index, max=Integer.MAX_VALUE; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } }

Slide 32

Copyright by Huang Hui @2004-2009 32 错误 public class Largest { public static int largest(int[] list) { int index, max=Integer.MAX_VALUE; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } } 我怎么会犯这么初级的错误 改为 max=0

Slide 33

Copyright by Huang Hui @2004-2009 33 增加测试内容 import junit.framework.*; public class TestLargest extends TestCase { public TestLargest(String name) { super(name); } public void testSimple() { assertEquals(9, Largest.largest(new int[] {9,8,7})); } public void testOrder() { assertEquals(9, Largest.largest(new int[] {9,8,7})); assertEquals(9, Largest.largest(new int[] {8,9,7})); } }

Slide 34

Copyright by Huang Hui @2004-2009 34 运行测试 - 2 C:\QA\Tools\JUnit\Examples>javac *.java C:\QA\Tools\JUnit\Examples>java junit.textui.TestRunner TestLargest .. Time: 0 OK (2 tests) C:\QA\Tools\JUnit\Examples>

Slide 35

Copyright by Huang Hui @2004-2009 35 再增加内容 import junit.framework.*; public class TestLargest extends TestCase { public TestLargest(String name) { super(name); } public void testSimple() { assertEquals(9, Largest.largest(new int[] {9,8,7})); } public void testOrder() { assertEquals(9, Largest.largest(new int[] {9,8,7})); assertEquals(9, Largest.largest(new int[] {8,9,7})); assertEquals(9, Largest.largest(new int[] {7,8,9})); } }

Slide 36

Copyright by Huang Hui @2004-2009 36 运行测试 - 3 C:\QA\Tools\JUnit\Examples>javac *.java C:\QA\Tools\JUnit\Examples>java junit.textui.TestRunner TestLargest ..F Time: 0 There was 1 failure: 1) testOrder(TestLargest)junit.framework.AssertionFailedError: expected:<9> but was:<8> at TestLargest.testOrder(TestLargest.java:15) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) FAILURES!!! Tests run: 2, Failures: 1, Errors: 0

Slide 37

Copyright by Huang Hui @2004-2009 37 问题在哪里? public class Largest { public static int largest(int[] list) { int index, max=0; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } }

Slide 38

Copyright by Huang Hui @2004-2009 38 错误 - 2 public class Largest { public static int largest(int[] list) { int index, max=0; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } } 不好意思,少数了一个 改为index<list.length

Slide 39

Copyright by Huang Hui @2004-2009 39 继续增加内容 import junit.framework.*; public class TestLargest extends TestCase { public TestLargest(String name) { super(name); } … … … … public void testDups() { assertEquals(9, Largest.largest(new int[] {9,8,7,9})); } public void testOne() { assertEquals(1, Largest.largest(new int[] {1})); } … … … … }

Slide 40

Copyright by Huang Hui @2004-2009 40 运行测试 - 4 C:\QA\Tools\JUnit\Examples>javac *.java C:\QA\Tools\JUnit\Examples>java junit.textui.TestRunner TestLargest .. Time: 0 OK (4 tests) C:\QA\Tools\JUnit\Examples>

Slide 41

Copyright by Huang Hui @2004-2009 41 再增加 import junit.framework.*; public class TestLargest extends TestCase { public TestLargest(String name) { super(name); } … … … … public void testNegative() { assertEquals(-7, Largest.largest(new int[] {-9,-8,-7})); } … … … … }

Slide 42

Copyright by Huang Hui @2004-2009 42 运行测试 - 5 C:\QA\Tools\JUnit\Examples>java junit.textui.TestRunner TestLargest .....F Time: 0 There was 1 failure: 1) testNegative(TestLargest)junit.framework.AssertionFailedError: expected:<-7> but was:<0> at TestLargest.testNegative(TestLargest.java:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) FAILURES!!! Tests run: 5, Failures: 1, Errors: 0

Slide 43

Copyright by Huang Hui @2004-2009 43 I can not believe this! public class Largest { public static int largest(int[] list) { int index, max=0; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } }

Slide 44

Copyright by Huang Hui @2004-2009 44 错误 public class Largest { public static int largest(int[] list) { int index, max=0; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } } 改为 max=Integer.MIN_VALUE

Slide 45

Copyright by Huang Hui @2004-2009 45 进一步考虑 如果 [ ] null 程序应对此有定义 public static int largest(int[] list) { int index, max=Integer.MIN_VALUE; if (list==null || list.length == 0) { throw new RuntimeException("Empty list"); } … … … … }

Slide 46

Copyright by Huang Hui @2004-2009 46 增加测试内容 public class TestLargest extends TestCase { … … … … public void testEmpty() { try { Largest.largest(null); fail( "Should have thrown an exception"); } catch (RuntimeException e) { assertTrue(true); } try { Largest.largest(new int[] {}); fail( "Should have thrown an exception"); } catch (RuntimeException e) { assertTrue(true); } } … … … … }

Slide 47

Copyright by Huang Hui @2004-2009 47 运行测试 - 6 C:\QA\Tools\JUnit\Examples>javac *.java C:\QA\Tools\JUnit\Examples>java junit.textui.TestRunner TestLargest ...... Time: 0.015 OK (6 tests)

Slide 48

Copyright by Huang Hui @2004-2009 48 Assert assertEquals assertEquals([String message],expected,actual) assertEquals([String message],expected,actual,tolerance) assertEquals("Should be 3 1/3", 3.33, 10.0/3.0, 0.01); assertNull assertNull([String message], java.lang.Object object) assertNotNull([String message], java.lang.Object object) assertSame assertSame([String message], expected, actual) assertNotSame([String message], expected, actual) assertTrue assertTrue([String message], boolean condition) assertFalse([String message], boolean condition) fail([String message]) 标记不应该到达的代码

Slide 49

Copyright by Huang Hui @2004-2009 49 JUnit框架

Slide 50

Copyright by Huang Hui @2004-2009 50 Testware Components

Slide 51

Copyright by Huang Hui @2004-2009 51 活动构件 Test Tool, Test Case Library, Test Suite是测试中的Action构件 Test Tool 1 Test Tool 2 Test Tool 3 Test Tool 4

Slide 52

Copyright by Huang Hui @2004-2009 52 JBuilder 通过JBuilder编写Largest

Slide 53

Copyright by Huang Hui @2004-2009 53 建立Project 指定测试代码路径

Slide 54

Copyright by Huang Hui @2004-2009 54 TestCase File->New创建TestCase

Slide 55

Copyright by Huang Hui @2004-2009 55 选择待测试方法 本例测试largest()

Slide 56

Copyright by Huang Hui @2004-2009 56 定义测试类的名称 测试类名称 TestLargest

Slide 57

Copyright by Huang Hui @2004-2009 57 配置 可以选择运行配置

Slide 58

Copyright by Huang Hui @2004-2009 58 运行测试

Slide 59

Copyright by Huang Hui @2004-2009 59 运行结果

Slide 60

Copyright by Huang Hui @2004-2009 60 运行结果 – 失败 改回max=0 失败原因

Slide 61

Copyright by Huang Hui @2004-2009 61 test suite public static Test suite(); 定义进行测试的集合,缺省状态下JUnit运行所有test函数 Foo TestRunner 1..* test case

Slide 62

Copyright by Huang Hui @2004-2009 62 TestClassOne.java import junit.framework.*; public class TestClassOne extends TestCase { public TestClassOne(String method) { super(method); } public void testAddition() { assertEquals(4, 2+2); } public void testSubtraction() { assertEquals(0, 2-2); } }

Slide 63

Copyright by Huang Hui @2004-2009 63 TestClassTwo.java import junit.framework.*; public class TestClassTwo extends TestCase { public TestClassTwo(String method) { super(method); } // This one takes a few hours... public void testLongRunner() { TSP tsp = new TSP(); // Load with default cities assertEquals(2300, tsp.shortestPath(50)); // top 50 } public void testShortTest() { TSP tsp = new TSP(); // Load with default cities assertEquals(140, tsp.shortestPath(5)); // top 5 }

Slide 64

Copyright by Huang Hui @2004-2009 64 TestClassTwo.java public void testAnotherShortTest() { TSP tsp = new TSP(); // Load with default cities assertEquals(586, tsp.shortestPath(10)); // top 10 } public static Test suite() { TestSuite suite = new TestSuite(); // Only include short tests suite.addTest( new TestClassTwo("testShortTest")); suite.addTest( new TestClassTwo("testAnotherShortTest")); return suite; } } C:\QA\Tools\JUnit\Examples\suite>java junit.textui.TestRunner TestClassTwo .. Time: 0 OK (2 tests)

Slide 65

Copyright by Huang Hui @2004-2009 65 JBuilder运行

Slide 66

Copyright by Huang Hui @2004-2009 66 使用setUp()和tearDown() public class TestDB extends TestCase { private Connection dbConn; protected void setUp() { dbConn = new Connection( "oracle", 1521,"fred", "foobar"); dbConn.connect(); } protected void tearDown() { dbConn.disconnect(); dbConn = null; } public void testAccountAccess() { // Uses dbConn } public void testEmployeeAccess() { // Uses dbConn } } 每个testXXX方法调用前运行setUp() 每个testXXX方法调用后运行tearDown()

Slide 67

Copyright by Huang Hui @2004-2009 67 小结 单元测试 极限编程 JUnit 测试用例设计 测试用例管理 自动化测试

Summary: Software Testing: Unit Testing

Tags: software testing unit

URL:
More by this User
Most Viewed