下面是一段load Eml格式邮件的代码,实例化一封邮件,获得邮件各个组成部分的对象属性。
public static CDO.Message LoadMessageFromEml(string url) { ADODB.Stream adoStream = null; adoStream = new ADODB.Stream(); adoStream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, string.Empty, string.Empty); adoStream.LoadFromFile(url); CDO.Message message = new CDO.Message(); message.DataSource.OpenObject(adoStream, “_stream”); adoStream.Close(); return message; } |
强化Fuzz testing力度,引入Culture random test
商业产品尤其是针对国际市场的产品需要全球化本地化测试,这涉及多语言文化的数据测试,由于我们无法覆盖某语言文化下的全部字符,故使用随机生成测试数据的方式尽量弥补这一缺陷,这样可提高测试的覆盖面积。在模糊测试的环境里,随机的测试数据也属于Fuzz概念的一部分,所以除了上述普通的Fuzz算法策略,我们考虑结合多语言文化的随机测试,即:在Fuzz的基础上,给测试数据填充多语言文化的随机字符串,在Unicode编码规范里,UTF-8作为它的表现形式容纳了全世界所有的语言文化字符(当然,不是绝对的),而每一种不同的语言字符集被安置在不同的固定区域内,在固定的区域内随机出来的位置就是针对该语言文化下一个随机的字符。
细化Fuzz testing粒度,区分对待不同文件类型
邮件附件的Fuzz存在文件格式的问题,如果都按照文本文件Fuzz策略进行Fuzz,势必会导致很多格式化文件Fuzz达不到应有的效果,反而破坏了正确的文件格式,所以更细化的Fuzz应该因文件类型而异。当然,如果测试者的目标就是测试文件格式是否被兼容则另当别论。在本实战中,测试目的是Fuzz出来更多可用的格式正确的邮件。
常见的邮件格式化文件类型的附件有MS Office文件和Adobe文件,首先把常见的格式整理出来,然后通过相应的格式解释器去解析格式化文件中的具体内容,比如通过微软Office文件便提供Office编程模型解析相应的Office文件,然后针对解析出来的内容进行Fuzz,做到测试目标明确,节省测试精力。
发送选项及结果验证
Fuzz之后便是启动压力测试以及测试的验证部分,在文中的测试环境中,需要在不同的邮件服务器上分发测试数据,如图5所示是发送选项的配置部分。
图5 发送选项的配置部分
其中,分发应用程序设置两种发送模式:Parallel, 并行模式,同时把所有的样本发送到所有可选的服务器上。Distributed, 分布式模式,为节约时间(经过Fuzz之后的样本会相对原来的量有指数倍的增长),把样本平均分配发送到不同的服务器上。
一个start!按钮带你启动全程测试:
图6 启动全程测试界面
然后就等着收获bug果实吧!
关于如何验证的流程,这里也做了创新,一般压力测试之后的验证会通过人工去检查程序或服务是否异常或是否产生内存泄漏,事实上这些都可以(应该)通过自动化测试去实现。而且,应该跑一轮功能性的自动化测试去验证在压力测试之后系统的基本功能是否还正常工作。最后再有目的地做探索性的测试。