第一次编写简单的中间件测试工具(1) - 记一次新员工训练营

时间:2022-05-19 11:35:27

去年11月,我加入了N记,紧接着进入新员工训练营。

开始一次简单的中间件测试工具编写任务。

这次训练营体验给我的感觉就是:大公司不愧是大公司,这回我终于可以安心学点核心技术了。

 

任务:

这个训练营有两个任务,一是熟悉这边的敏捷开发流程;二是在训练营里做一定的编码,用python编写一个测试工具(桩,stub)。

我们要做的这个工具,是用来测试我们一种通信设备(B)上运行的程序(某种中间件),这个工具模拟另一种通信设备(A),发送一些按特定协议编码的消息给另一种通信设备B,并能反编码设备B返回的消息,也就是说要测设备B上的程序在收到一些消息时能否做出正确的回应。

设备B对于不同消息的不同回应有一系列的业务场景,每种业务场景可能包含几种正确的情况,几种异常的情况。这些场景,类似于我们做黑盒手工测试时经常看到的业务场景。

 

而我们的工具要做的事情,就是:

1.读取用户输入

2.把用户输入组装成待编码的文本

3.对待编码的文本以需求规定的协议进行编码,编码成特定的由0101构成的8位元组串,通常就是类似这样:0101010111010000110101011010100 一大串大家肉眼看不懂的东东

4.让我们工具跟指定的ip地址通过3次握手建立TCP链接

5.在建立好TCP链接后,通过发送/接收指定的登录消息完成两种设备在我们自定义的协议层面上的连接

6.把第3步编码好的消息发到目标ip,并且接收对方返回的消息,把收到的消息压入消息队列。最后从消息队列中提出我们期望收到的反馈消息

7. 再把结果反馈给用户。

 

整个过程,这么多步骤,以一定的规则分别封装成robot关键字,以便自动化测试组成员进行调用。

所有以上这些步骤,均以python实现。

 

此外,还有附带的单元测试脚本,也是必须的。

 

现有代码大概三四千行的样子,实现了两种设备之间通信的模拟,我们这一期,除了要增加一些这两种设备之间的消息类型和场景之外,还要实现第三种设备的模拟器。

当然,第三种设备C和待测设备的通信B的通信,同样遵循A和B的通信的那套协议和规则,只是客户端和服务端的角色有所变化。

也就是说,A是B的服务端,B是A的客户端。一个A可以和多个B同时通信。同时B又是C的服务端,C是B的客户端。

 

有一个导师帮我们解答一些疑难问题,帮了大忙了~

还有一份详细定义了协议和消息场景的文档也帮了不少忙。

就算这样子,我们还是遇到了不小的困难:

1.是进入这个训练营的时间,大家是不同的,也就是说我们按入职先后分别进入了训练营,并且有的人会提前离开训练营。

第一批人进入之后有一周时间学习和熟悉python并听一些其他各方面的培训课程。(技术、业务、流程)

然后又有一周时间学习和熟悉这个工具的现有代码。

第二批人也就是我进来之后已经是整个流程的第三周,就是说要开始真实写代码了。我基本上没时间熟悉python和读代码。

而且这一周一开始,第一批人就要走掉3个,他们基本不能参与写代码了

2.是训练营成员的编程基础大不相同。但基本都不熟悉python。

这个训练营新员工里有开发也有测试,开发基本上都是C出身,测试都是黑盒出身。。。只有我是自动化测试出身的还学了杂七杂八一大堆语言。

所以我的优势是我学的乱七八糟的语言多,基本上再学个python达到能写这个工具的程度是用不了一两天的。

但问题是其他测试一开始基本写不了代码。而所有人在我进入这个team的时间点上,还没有搞明白整个工具的内部逻辑。

大部分人仍是一头雾水,两个C程序员基本搞懂一两个模块。(按我的划分一共4个模块)

所有人还没有成功从git上拿代码,也没有人成功执行单元测试。。。。这个我进入team当天就帮大家搞定了,主要是其他所有人都没用过git,也不了解python的单元测试框架怎么运行,当然对我们专门搞自动化测试的人来说,不管什么语言的单元测试框架,都是那么的相似。

3.是我由于不是第一批进入,没有时间参加其他课程的学习,但是我还必须参加其他课程的考试。。。

以及被安排了很多网上学习课程必须尽快完成。。。

 

按照我对自己的要求,我既然参加了这个训练营,那么这个小工具的代码我必须读完。读完的标准,我定的是:必须做到这东西就跟全部是我亲手写出来的一样。(惭愧的是最后离开训练营,还没做到百分百跟亲手写出来一样,大概达成了95%吧,剩下5%是对按某协议规则编码的第三方类库的内部原理还没看过)。不然如果我参加完训练营回到team,team的人问我学了什么,我怎么说呢,脱产两周去训练营做工具,竟然还不能把一个三四千行的工具全部搞懂搞透,我不知道别人怎么看,首先我自己这关我也过不了。

于是我定下的学习重点就是:

1.迅速完成现有代码的阅读,运行并调试所有的单元测试,理解所有第三方库的调用和使用他们的原因,理解所有这个工具的底层原理。

2.迅速按照要求实现出至少一个我们要做的关键字,完成一种消息的收发,并测试通过。然后这个代码拿给其他人做参考,因为有的人真心不适合写代码,没东西参考基本可以保证他们的模块完不成。

3.迅速完成所有我拿下来的关键字编写任务。然后看谁的来不及就给他搞定。并多给大家做code review。

总之虽然我没不是scrum master或其他什么特殊角色,但我直觉知道这个sprint我不出大力气的话,一定失败。然后我估计了一下如果全部代码由我一个人完成,差不多也能做完。不过还是给大家一点空间,让大家自己做比较符合上面的期望。

下一篇分享读代码的个人心得、我对敏捷的理解、关键字驱动的自动化测试、git基础、等知识是如何应用在这个简单的中间件测试工具上。