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

iOS测试驱动开发(TDD)实战 – MarsRover火星车问题求职学习资料

D0b2wT.gif

本文介绍了iOS测试驱动开发(TDD)实战 – MarsRover火星车问题求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

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

一、问题描述

火星漫步者在某块区域中根据指令进行移动,然后采集相应位置的火星数据。

火星车收到的指令分为四类:

  1. 探索区域信息:告知火星车,整片区域的长度(X)和宽度(Y)有多大;
  2. 初始化信息:火星车的降落地点(x, y)和朝向(N, S, E, W)信息;
  3. 移动指令:火星车可以前进(M);
  4. 转向指令:火星车可以左转 90 度(L)或右转 90 度(R)。

由于地球和火星之间的距离很远,指令必须批量发送,火星车执行完整批指令之后,再回报自己所在的位置坐标和朝向。

二、任务拆解(需求分析)

iOS测试驱动开发(TDD)实战 - MarsRover火星车问题

火星车任务拆解

(1)每个单元,都需要明确输入和输出。如果你不能确定这些输入和输出,那么你现在要做的事情就是继续理解需求,或者是找产品经理同学讨论。
(2)进行实现的时候,要遵循从右往左的原则。直到需求完全得到实现。

三、红、绿、重构

  • 红:编写测试用例确保测试不通过
  • 绿:以最低的成本实现函数,确保测试用例通过。
  • 重构:重构的工作应该贯穿项目的始终,如果有超过20行的代码没有被重构,他将在未来变得很难维护。
  • 重复上述步骤,知道完成需求。

下面我们就将以【转向】这个函数为例进行示范。

typedef enum DIREDRTION {     DIREDRTION_N  = 0, // 北     DIREDRTION_E, // 东     DIREDRTION_S, // 南     DIREDRTION_W // 西 } DIREDRTION;
- (DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{         return -1; }

3.1 红

新建一个测试用例,测试用例是我们已知的事实,是我们对函数行为的预期。抽象地说就是:我们明确地知道输入将得到一个怎样的输出。

// 转向函数 // 输入:当前方向(向南)、转向命令(右转) // 输出:转向后方向(向西) - (void)testTurn{     MarsRover *rover = [[MarsRover alloc] init];     {         DIREDRTION direction = [rover turn:@"R" curDirection:DIREDRTION_S];         XCTAssertTrue(direction == DIREDRTION_W,"turn:curDirection函数验证失败");     } }

运行测试,测试不通过。红!

3.2 绿

现在我们将以最小的成本去满足这个这个case

- (DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{     if ([cmd isEqualToString:@"R"]) {         if (curDirection == DIREDRTION_E) {             return DIREDRTION_S;         }     }     return -1; }

运行测试,通过。绿!

3.3重构

在写代码的过程中我们往往会闻到一些代码的坏味道,如果闻到了,请立即重构。暂时没闻到,咱们接着进行…

3.4 重复上述过程

我们不停的增加测试用例,并且不断的以最小代价完成代码功能以通过测试。
“`objective-c
-(DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{
cmd = [cmd uppercaseString];
if (!([cmd isEqualToString:@”L”] || [cmd isEqualToString:@”R”])) {
return -1;
}
if ([cmd isEqualToString:@”L”]) {
if (curDirection == DIREDRTION_S) {
return DIREDRTION_E;
}else if (curDirection == DIREDRTION_N) {
return DIREDRTION_W;
}else if (curDirection == DIREDRTION_E) {
return DIREDRTION_N;
}else{
return DIREDRTION_S;
}
}
if ([cmd isEqualToString:@”R”]) {
if (curDirection == DIREDRTION_S) {
return DIREDRTION_W;
}else if (curDirection == DIREDRTION_N) {
return DIREDRTION_E;
}else if (curDirection == DIREDRTION_E) {
return DIREDRTION_S;
}else{
return DIREDRTION_N;
}
}

一、问题描述

火星漫步者在某块区域中根据指令进行移动,然后采集相应位置的火星数据。

火星车收到的指令分为四类:

  1. 探索区域信息:告知火星车,整片区域的长度(X)和宽度(Y)有多大;
  2. 初始化信息:火星车的降落地点(x, y)和朝向(N, S, E, W)信息;
  3. 移动指令:火星车可以前进(M);
  4. 转向指令:火星车可以左转 90 度(L)或右转 90 度(R)。

由于地球和火星之间的距离很远,指令必须批量发送,火星车执行完整批指令之后,再回报自己所在的位置坐标和朝向。

二、任务拆解(需求分析)

iOS测试驱动开发(TDD)实战 - MarsRover火星车问题

火星车任务拆解

(1)每个单元,都需要明确输入和输出。如果你不能确定这些输入和输出,那么你现在要做的事情就是继续理解需求,或者是找产品经理同学讨论。
(2)进行实现的时候,要遵循从右往左的原则。直到需求完全得到实现。

三、红、绿、重构

  • 红:编写测试用例确保测试不通过
  • 绿:以最低的成本实现函数,确保测试用例通过。
  • 重构:重构的工作应该贯穿项目的始终,如果有超过20行的代码没有被重构,他将在未来变得很难维护。
  • 重复上述步骤,知道完成需求。

下面我们就将以【转向】这个函数为例进行示范。

typedef enum DIREDRTION {     DIREDRTION_N  = 0, // 北     DIREDRTION_E, // 东     DIREDRTION_S, // 南     DIREDRTION_W // 西 } DIREDRTION;
- (DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{         return -1; }

3.1 红

新建一个测试用例,测试用例是我们已知的事实,是我们对函数行为的预期。抽象地说就是:我们明确地知道输入将得到一个怎样的输出。

// 转向函数 // 输入:当前方向(向南)、转向命令(右转) // 输出:转向后方向(向西) - (void)testTurn{     MarsRover *rover = [[MarsRover alloc] init];     {         DIREDRTION direction = [rover turn:@"R" curDirection:DIREDRTION_S];         XCTAssertTrue(direction == DIREDRTION_W,"turn:curDirection函数验证失败");     } }

运行测试,测试不通过。红!

3.2 绿

现在我们将以最小的成本去满足这个这个case

- (DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{     if ([cmd isEqualToString:@"R"]) {         if (curDirection == DIREDRTION_E) {             return DIREDRTION_S;         }     }     return -1; }

运行测试,通过。绿!

3.3重构

在写代码的过程中我们往往会闻到一些代码的坏味道,如果闻到了,请立即重构。暂时没闻到,咱们接着进行…

3.4 重复上述过程

我们不停的增加测试用例,并且不断的以最小代价完成代码功能以通过测试。
“`objective-c
-(DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{
cmd = [cmd uppercaseString];
if (!([cmd isEqualToString:@”L”] || [cmd isEqualToString:@”R”])) {
return -1;
}
if ([cmd isEqualToString:@”L”]) {
if (curDirection == DIREDRTION_S) {
return DIREDRTION_E;
}else if (curDirection == DIREDRTION_N) {
return DIREDRTION_W;
}else if (curDirection == DIREDRTION_E) {
return DIREDRTION_N;
}else{
return DIREDRTION_S;
}
}
if ([cmd isEqualToString:@”R”]) {
if (curDirection == DIREDRTION_S) {
return DIREDRTION_W;
}else if (curDirection == DIREDRTION_N) {
return DIREDRTION_E;
}else if (curDirection == DIREDRTION_E) {
return DIREDRTION_S;
}else{
return DIREDRTION_N;
}
}

一、问题描述

火星漫步者在某块区域中根据指令进行移动,然后采集相应位置的火星数据。

火星车收到的指令分为四类:

  1. 探索区域信息:告知火星车,整片区域的长度(X)和宽度(Y)有多大;
  2. 初始化信息:火星车的降落地点(x, y)和朝向(N, S, E, W)信息;
  3. 移动指令:火星车可以前进(M);
  4. 转向指令:火星车可以左转 90 度(L)或右转 90 度(R)。

由于地球和火星之间的距离很远,指令必须批量发送,火星车执行完整批指令之后,再回报自己所在的位置坐标和朝向。

二、任务拆解(需求分析)

iOS测试驱动开发(TDD)实战 - MarsRover火星车问题

火星车任务拆解

(1)每个单元,都需要明确输入和输出。如果你不能确定这些输入和输出,那么你现在要做的事情就是继续理解需求,或者是找产品经理同学讨论。
(2)进行实现的时候,要遵循从右往左的原则。直到需求完全得到实现。

三、红、绿、重构

  • 红:编写测试用例确保测试不通过
  • 绿:以最低的成本实现函数,确保测试用例通过。
  • 重构:重构的工作应该贯穿项目的始终,如果有超过20行的代码没有被重构,他将在未来变得很难维护。
  • 重复上述步骤,知道完成需求。

下面我们就将以【转向】这个函数为例进行示范。

typedef enum DIREDRTION {     DIREDRTION_N  = 0, // 北     DIREDRTION_E, // 东     DIREDRTION_S, // 南     DIREDRTION_W // 西 } DIREDRTION;
- (DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{         return -1; }

3.1 红

新建一个测试用例,测试用例是我们已知的事实,是我们对函数行为的预期。抽象地说就是:我们明确地知道输入将得到一个怎样的输出。

// 转向函数 // 输入:当前方向(向南)、转向命令(右转) // 输出:转向后方向(向西) - (void)testTurn{     MarsRover *rover = [[MarsRover alloc] init];     {         DIREDRTION direction = [rover turn:@"R" curDirection:DIREDRTION_S];         XCTAssertTrue(direction == DIREDRTION_W,"turn:curDirection函数验证失败");     } }

运行测试,测试不通过。红!

3.2 绿

现在我们将以最小的成本去满足这个这个case

- (DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{     if ([cmd isEqualToString:@"R"]) {         if (curDirection == DIREDRTION_E) {             return DIREDRTION_S;         }     }     return -1; }

运行测试,通过。绿!

3.3重构

在写代码的过程中我们往往会闻到一些代码的坏味道,如果闻到了,请立即重构。暂时没闻到,咱们接着进行…

3.4 重复上述过程

我们不停的增加测试用例,并且不断的以最小代价完成代码功能以通过测试。
“`objective-c
-(DIREDRTION)turn:(NSString *)cmd curDirection:(DIREDRTION)curDirection{
cmd = [cmd uppercaseString];
if (!([cmd isEqualToString:@”L”] || [cmd isEqualToString:@”R”])) {
return -1;
}
if ([cmd isEqualToString:@”L”]) {
if (curDirection == DIREDRTION_S) {
return DIREDRTION_E;
}else if (curDirection == DIREDRTION_N) {
return DIREDRTION_W;
}else if (curDirection == DIREDRTION_E) {
return DIREDRTION_N;
}else{
return DIREDRTION_S;
}
}
if ([cmd isEqualToString:@”R”]) {
if (curDirection == DIREDRTION_S) {
return DIREDRTION_W;
}else if (curDirection == DIREDRTION_N) {
return DIREDRTION_E;
}else if (curDirection == DIREDRTION_E) {
return DIREDRTION_S;
}else{
return DIREDRTION_N;
}
}

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

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » iOS测试驱动开发(TDD)实战 – MarsRover火星车问题求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

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

b2b链

联系我们联系我们