TDD(测试驱动设计):通过大量测试寻找最优解决方案

 这两天,我一直在做“测试人员”,不过跟一般的测试人员不同的是,我是在写代码做测试,这些代码是我头脑中的某种设计理念的表示,我坚信,只有不断的“测试”我的这些设计,才能够找到最优的解决方案。

    最近我在设计开发一个“wcf邮件通信系统”,目的是为了在两个不能够直接通信的环境中使用邮件作为消息通道,所以系统的关键之一就是邮件收发的效率和稳定性,怎么样才能够使得邮件内容最小?哪种格式的邮件内容处理最快?哪种方案能够消耗最小的cup资源而又占用合适的内存大小?下面是我的一个测试过程:

1,对象序列化测试

象使用xml序列化,占用的存储量太大;

json序列化,由于使用的是第三方类库,无法控制序列化细节,占用存储量还是比较大;

自定义实体类序列化器,细节由我完全控制,占用存储量最小;

2,数据存储格式测试

数据采用文本还是二进制方式存储?当然二进制存储量最小,但是文本格式可以有很高的压缩比,而且可读性好,这恰是二进制的缺点;

3,字符编码格式测试

使用gb2312,utf-8还是ascii?gb2312比较适合汉字处理,utf-8不会有国际化表示问题,ascii显然不行,它是7位字节表示的,还有没有效率更高的?这就需要测试了,最后终于找到一种编码格式:iso-8551,这是一种8位编码格式,非常适合处理二进制的字节数据。

4,压缩格式测试

使用winrar?不开源,除了问题比较麻烦,而且客户机器需要安装它;

使用zip 格式?开源的用过,以前好像还是发现有问题;

使用gzip?.net框架自己带的,相信不会有大问题,但用的少,还是需要测试;

5,数据编码方案测试

经过反复测试,发现很多邮件系统对于正文中包含大量的ascii字符有可能识别为垃圾邮件或者病毒邮件,根本无法发送邮件,所以直接使用base64格式对正文编码的方案泡汤,来看只有自己编码了,那要怎么编码才会认为是安全的?看下面的数据格式:

686a,0f00,0105,--双16进制格式,

686a0f,000105,--3字节16进制格式,

显然,采用3字节16进制格式能够更节省存储量,但反复测试发现,当正文长度超过100,000,opensmtp组件发送邮件很不稳定,经常无法发出,但是双16进制位格式却没有任何问题,只有这样了:-《

经过这些天以来不断的测试,不断的修改原有的邮件收发的设计方案,最终采用了“自定义实体类序列化+二进制数据存储+iso-8551字符编码+双16进制格式数据编码 ”的设计方案,由于对象数据本身已经是二进制了,各种压缩工具对于二进制数据几乎没有压缩效率,所以省去了“数据压缩”这个过程,最终在数据存储量、传输效率、cpu效率方面取得了最佳平衡。

所以,测试不仅仅是测试人员的事情,作为开发设计人员,如果要让你的成果是最优的,那么采用tdd吧,反复测试你的设计,最终找到最优的解决方案。

下面是附带的测试数据:

--------------------------

**新版查询结果(采用最优方案):

1,查询全部雇员数据:

198962 字符,(编码前,下同)

500390 字符,(编码后,下同)

2,查询客户数据,国家 usa,

1957 字符,

4222 字符,

------------------------

*旧版本结果(json序列化+base64编码+数据压缩):

1,查询客户数据,国家 usa,

8706 字符,

6230 字符,

2,查询全部雇员数据:

534022 字符,

830348 字符,

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python中文社区

Python 3.7.0 版本正式发布,新特性来袭

Python 3.7.0版本已经于美国时间2018年6月27日发布,同时发布的也有Python 3.6.6版本,下面是来自Python官网的通知:

15340
来自专栏coding for love

JS常用设计模式解析02-策略模式

在于都本文之前,希望大家能够先阅读以下JS进阶系列03-JS面向对象的三大特征之多态这篇文章,了解JS的多态。在这篇文章,我们举了一个例子,就是选拔官员选拔合唱...

13230
来自专栏HansBug's Lab

一个很逗的东西——Jd

这个嘛是本人专门为了NOI上面对拍程序写的对拍程序,已经经历了NOI2015的考验;更重要的是——纯Pascal的哦(HansBug:其实是我不会写.sh脚本T...

318120
来自专栏诸葛青云的专栏

C语言编程实例:清空对方应用程序

今天的文章跟大家讲一下,C语言中的文件操作——遍历文件夹和删除文件,以及如何应用这两个技能来写一个有趣的小程序,这篇文章涉及的知识点很少,也很简单,所以这篇文章...

19900
来自专栏mySoul

JavaScript设计模式入坑

9300
来自专栏ionic3+

safari日期转换的注意事项

考虑到苹果设备使用,所以不能忽略safari,明明早就知道要留意了,结果新的项目又忽略了,小记一下:

8930
来自专栏mini188

学习笔记:内存,堆栈,到底为何物?

     在网上看到了一篇关于面试的博客文,突然发现自己对于这个博主而言简直差的是十万八千里,他提到的许多技术我尽然一个也答不上来。于是就开始反思,还是要抱一抱...

24660
来自专栏向治洪

qq安全原理

    故事总要有缘由,那么这个故事的缘由就是,当我以前写了一个获取其它进程密码框密码的时候(前几篇博客中有描述),我抱着试一试的心情去试探了一下能不能得到 Q...

17980
来自专栏java一日一条

Java 元编程及其应用

同样是实现一个投票系统,一个是python程序员,基于django-framework,用了半小时就搭建了一个完整系统,另外一个是标准的SSM(Spring-S...

21210
来自专栏owent

Rust的第二次接触-写个小服务器程序

蛮久前入门了一下 Rust 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下,之前也用它给我们项目写了个命令行小工具。这回拿来写个小...

1.4K30

扫码关注云+社区

领取腾讯云代金券