区块链技术博客
www.b2bchain.cn

COURSE-5 测试驱动开发TDD求职学习资料

本文介绍了COURSE-5 测试驱动开发TDD求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

一、什么是TDD

首先需要明确的是TDD是一项开发技术而不是测试技术。它要求编写某个功能之前先编写测试代码,然后只编写使测试通过的代码,通过测试用例来驱动开发的进行,以达到代码简洁可用的效果。

二、为什么需要TDD

讨论这个问题之前,我们先看一下我们日常是怎么做开发的。

(1)需求紧急,下周上线
(2)打开电脑直接开始写代码,写到一半的时候发现需求有不明确的地方。去找需求方确认。发现需求理解有偏差,此时代码已经不容易修改
(3)开发完成,提交测试,测试人员反馈BUG,修复BUG,在修复的过程中很可能会引入新的BUG,大规模的回归测试时间上不允许。
(4)上线之后提心掉胆。

那么,从上面的内容看,我们开发人员的痛点是什么

(1)一个详细、准确的需求文档。越是时间紧张,越是要和需求方确认清楚我们的需求
(2)debug的时候,不引入新的BUG
(3)我们有持续改善我们项目的需求,在出现需求变动的时候,需要快速响应。

TDD可以有效的帮助我们处理这些痛点。

三、如何TDD

下图展示的是一个TDD环

(1)橙色(Think – Write Test Case),测试先行,先思考我们要完成一个什么样子的测试用例
(2)红(new test case fail),我们还没有进行我们函数的编写,所以测试用例会失败
(3)绿(new test case pass),编写能让测试用例通过的代码
(4)深绿色(all old TC pass),新编写的功能不能影响以前的测试用例,即不引入新的BUG
(5)蓝色(Refactor-Clear):重构,如果需要重构的话,那么就去重构。
COURSE-5 测试驱动开发TDD

四、一个简单的例子

需求:0-100,如果是3的倍数打印fizz,否则打印数字

我们先明确我们要写的函数,输入一个数字,返回一个字符串,如果数字是3的倍数返回fizz,否则返回数字

+ (NSString*)outputString:(int)input{         return @"" }

(1)测试先行。我们第一个测试用例就是,输入1,得到的返回值就是1

- (void)testOutputString {     int input = 1;     NSString *expect = @"1";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(2)运行测试,失败

(3)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }     return @""; }

(4)测试用例通过

(5)新增测试用例

- (void)testOutputString {   {     int input = 1;     NSString *expect = @"1";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect);   }   {     int input = 2;     NSString *expect = @"2";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect);   } }

(6)运行测试,当前case通过,所有case通过

(7)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }else if (input == 2) {         return @"2";     }     return @""; }

(8)运行测试,当前case通过,所有case通过

(9)重构测试用例

- (void)testOutputString{     [self assertOutputString:1 expect:@"1"];     [self assertOutputString:2 expect:@"2"]; }  - (void)assertOutputString:(int)input expect:(NSString *)expect{     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(10)新增测试用例

- (void)testOutputString{     [self assertOutputString:1 expect:@"1"];     [self assertOutputString:2 expect:@"2"];     [self assertOutputString:3 expect:@"fizz"]; }  - (void)assertOutputString:(int)input expect:(NSString *)expect{     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(11)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }else if (input == 2) {         return @"2";     }else if (input == 3) {         return @"fizz";     }     return @""; }

(12)运行测试,当前case通过,所有case通过

(13)发现规律,重构

+ (NSString*)outputString:(int)input{     if (input % 3 == 0) {         return @"fizz";     }else{         return [NSString stringWithFormat:@"%d", input];     } }

(14)运行测试,当前case通过,所有case通过。

Q:测试代码是否需要重构

A:需要,但是我们我们的主要精力应该分配在业务代码上而不是测试代码上。

Q:什么时候需要重构

A:始终,程序的重构应该贯穿项目的整个生命周期。一段代码如果超过20行没有重构那么大概率你以后也不会重构它。这一点非常重要。

五、项目拆分技术

在上面的部分我们介绍了,我们如何用TDD的方法简单的编写一个函数。但是我们日常的项目的规模和复杂度远超想象。那么我们如何将一个庞大的需求拆分成一个个功能单元呢?

我们可以把我们的计算机看作是一个输入输出的模型。
COURSE-5 测试驱动开发TDD

我们也可以把我们的需求看作是一个输入输出系统。然后拆分出一个个的子系统,

COURSE-5 测试驱动开发TDD

一、什么是TDD

首先需要明确的是TDD是一项开发技术而不是测试技术。它要求编写某个功能之前先编写测试代码,然后只编写使测试通过的代码,通过测试用例来驱动开发的进行,以达到代码简洁可用的效果。

二、为什么需要TDD

讨论这个问题之前,我们先看一下我们日常是怎么做开发的。

(1)需求紧急,下周上线
(2)打开电脑直接开始写代码,写到一半的时候发现需求有不明确的地方。去找需求方确认。发现需求理解有偏差,此时代码已经不容易修改
(3)开发完成,提交测试,测试人员反馈BUG,修复BUG,在修复的过程中很可能会引入新的BUG,大规模的回归测试时间上不允许。
(4)上线之后提心掉胆。

那么,从上面的内容看,我们开发人员的痛点是什么

(1)一个详细、准确的需求文档。越是时间紧张,越是要和需求方确认清楚我们的需求
(2)debug的时候,不引入新的BUG
(3)我们有持续改善我们项目的需求,在出现需求变动的时候,需要快速响应。

TDD可以有效的帮助我们处理这些痛点。

三、如何TDD

下图展示的是一个TDD环

(1)橙色(Think – Write Test Case),测试先行,先思考我们要完成一个什么样子的测试用例
(2)红(new test case fail),我们还没有进行我们函数的编写,所以测试用例会失败
(3)绿(new test case pass),编写能让测试用例通过的代码
(4)深绿色(all old TC pass),新编写的功能不能影响以前的测试用例,即不引入新的BUG
(5)蓝色(Refactor-Clear):重构,如果需要重构的话,那么就去重构。
COURSE-5 测试驱动开发TDD

四、一个简单的例子

需求:0-100,如果是3的倍数打印fizz,否则打印数字

我们先明确我们要写的函数,输入一个数字,返回一个字符串,如果数字是3的倍数返回fizz,否则返回数字

+ (NSString*)outputString:(int)input{         return @"" }

(1)测试先行。我们第一个测试用例就是,输入1,得到的返回值就是1

- (void)testOutputString {     int input = 1;     NSString *expect = @"1";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(2)运行测试,失败

(3)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }     return @""; }

(4)测试用例通过

(5)新增测试用例

- (void)testOutputString {   {     int input = 1;     NSString *expect = @"1";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect);   }   {     int input = 2;     NSString *expect = @"2";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect);   } }

(6)运行测试,当前case通过,所有case通过

(7)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }else if (input == 2) {         return @"2";     }     return @""; }

(8)运行测试,当前case通过,所有case通过

(9)重构测试用例

- (void)testOutputString{     [self assertOutputString:1 expect:@"1"];     [self assertOutputString:2 expect:@"2"]; }  - (void)assertOutputString:(int)input expect:(NSString *)expect{     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(10)新增测试用例

- (void)testOutputString{     [self assertOutputString:1 expect:@"1"];     [self assertOutputString:2 expect:@"2"];     [self assertOutputString:3 expect:@"fizz"]; }  - (void)assertOutputString:(int)input expect:(NSString *)expect{     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(11)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }else if (input == 2) {         return @"2";     }else if (input == 3) {         return @"fizz";     }     return @""; }

(12)运行测试,当前case通过,所有case通过

(13)发现规律,重构

+ (NSString*)outputString:(int)input{     if (input % 3 == 0) {         return @"fizz";     }else{         return [NSString stringWithFormat:@"%d", input];     } }

(14)运行测试,当前case通过,所有case通过。

Q:测试代码是否需要重构

A:需要,但是我们我们的主要精力应该分配在业务代码上而不是测试代码上。

Q:什么时候需要重构

A:始终,程序的重构应该贯穿项目的整个生命周期。一段代码如果超过20行没有重构那么大概率你以后也不会重构它。这一点非常重要。

五、项目拆分技术

在上面的部分我们介绍了,我们如何用TDD的方法简单的编写一个函数。但是我们日常的项目的规模和复杂度远超想象。那么我们如何将一个庞大的需求拆分成一个个功能单元呢?

我们可以把我们的计算机看作是一个输入输出的模型。
COURSE-5 测试驱动开发TDD

我们也可以把我们的需求看作是一个输入输出系统。然后拆分出一个个的子系统,

COURSE-5 测试驱动开发TDD

一、什么是TDD

首先需要明确的是TDD是一项开发技术而不是测试技术。它要求编写某个功能之前先编写测试代码,然后只编写使测试通过的代码,通过测试用例来驱动开发的进行,以达到代码简洁可用的效果。

二、为什么需要TDD

讨论这个问题之前,我们先看一下我们日常是怎么做开发的。

(1)需求紧急,下周上线
(2)打开电脑直接开始写代码,写到一半的时候发现需求有不明确的地方。去找需求方确认。发现需求理解有偏差,此时代码已经不容易修改
(3)开发完成,提交测试,测试人员反馈BUG,修复BUG,在修复的过程中很可能会引入新的BUG,大规模的回归测试时间上不允许。
(4)上线之后提心掉胆。

那么,从上面的内容看,我们开发人员的痛点是什么

(1)一个详细、准确的需求文档。越是时间紧张,越是要和需求方确认清楚我们的需求
(2)debug的时候,不引入新的BUG
(3)我们有持续改善我们项目的需求,在出现需求变动的时候,需要快速响应。

TDD可以有效的帮助我们处理这些痛点。

三、如何TDD

下图展示的是一个TDD环

(1)橙色(Think – Write Test Case),测试先行,先思考我们要完成一个什么样子的测试用例
(2)红(new test case fail),我们还没有进行我们函数的编写,所以测试用例会失败
(3)绿(new test case pass),编写能让测试用例通过的代码
(4)深绿色(all old TC pass),新编写的功能不能影响以前的测试用例,即不引入新的BUG
(5)蓝色(Refactor-Clear):重构,如果需要重构的话,那么就去重构。
COURSE-5 测试驱动开发TDD

四、一个简单的例子

需求:0-100,如果是3的倍数打印fizz,否则打印数字

我们先明确我们要写的函数,输入一个数字,返回一个字符串,如果数字是3的倍数返回fizz,否则返回数字

+ (NSString*)outputString:(int)input{         return @"" }

(1)测试先行。我们第一个测试用例就是,输入1,得到的返回值就是1

- (void)testOutputString {     int input = 1;     NSString *expect = @"1";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(2)运行测试,失败

(3)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }     return @""; }

(4)测试用例通过

(5)新增测试用例

- (void)testOutputString {   {     int input = 1;     NSString *expect = @"1";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect);   }   {     int input = 2;     NSString *expect = @"2";     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect);   } }

(6)运行测试,当前case通过,所有case通过

(7)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }else if (input == 2) {         return @"2";     }     return @""; }

(8)运行测试,当前case通过,所有case通过

(9)重构测试用例

- (void)testOutputString{     [self assertOutputString:1 expect:@"1"];     [self assertOutputString:2 expect:@"2"]; }  - (void)assertOutputString:(int)input expect:(NSString *)expect{     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(10)新增测试用例

- (void)testOutputString{     [self assertOutputString:1 expect:@"1"];     [self assertOutputString:2 expect:@"2"];     [self assertOutputString:3 expect:@"fizz"]; }  - (void)assertOutputString:(int)input expect:(NSString *)expect{     NSString *result = [Tool outputString:input];     XCTAssertEqualObjects(result, expect); }

(11)编写只满足当前case的代码

+ (NSString*)outputString:(int)input{     if (input == 1) {         return @"1";     }else if (input == 2) {         return @"2";     }else if (input == 3) {         return @"fizz";     }     return @""; }

(12)运行测试,当前case通过,所有case通过

(13)发现规律,重构

+ (NSString*)outputString:(int)input{     if (input % 3 == 0) {         return @"fizz";     }else{         return [NSString stringWithFormat:@"%d", input];     } }

(14)运行测试,当前case通过,所有case通过。

Q:测试代码是否需要重构

A:需要,但是我们我们的主要精力应该分配在业务代码上而不是测试代码上。

Q:什么时候需要重构

A:始终,程序的重构应该贯穿项目的整个生命周期。一段代码如果超过20行没有重构那么大概率你以后也不会重构它。这一点非常重要。

五、项目拆分技术

在上面的部分我们介绍了,我们如何用TDD的方法简单的编写一个函数。但是我们日常的项目的规模和复杂度远超想象。那么我们如何将一个庞大的需求拆分成一个个功能单元呢?

我们可以把我们的计算机看作是一个输入输出的模型。
COURSE-5 测试驱动开发TDD

我们也可以把我们的需求看作是一个输入输出系统。然后拆分出一个个的子系统,

COURSE-5 测试驱动开发TDD

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » COURSE-5 测试驱动开发TDD求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们