之前我们介绍了很多白盒测试的方法,包括代码静态检测,代码走查等测试方法。
  这次跟大家分享一些白盒测试方法的细节——如何抓取网络请求。
  我们在做单元测试的时候经常会遇见被测函数的输出是发出一条网络请求,我们需要抓取这一条网络请求,并且和预期值进行对比。
  问题是如何把抓取请求集成到单元测试代码中呢?下面给大家介绍几种方法供大家参考和批评。
  方法一:设置代理服务器法
  在本地设置一台代理服务器,然后把host统统指向我们的代理服务器,这样所有的请求都会走我们的代理服务器。我们可以把需要网络请求写到log文 件中,这样我们可以获取需要的网络请求了。Apache服务器可以满足我们的基本需求,当然你也可以自己定制开发自己的代理。
  缺点:每次抓请求都要修改host文件,环境部署不容易。
  方法二:通过fiddler抓取网络请求
  Fiddler获取网络请求工具大家也许不会陌生,是一款方面而好用的请求抓取工具。
  借助于fiddler,修改fiddler的customrule.js,对指定域名的请进行抓取,并保存在log文件中,对log文件进行解析。
  打开fiddler,选择rules->CustomRules,,打开customrules.js脚本在static function OnBeforeRequest(oSession: Session)函数下添加如下脚本,保存即可。
  if (oSession.PathAndQuery.Contains("/skins/newFile") || oSession.PathAndQuery.Contains("ime_updatessf.php") || oSession.PathAndQuery.Contains("updateskin.gif")) {
  var fso, tf;
  fso = new ActiveXObject("scripting.FileSystemObject");
  var path = "D:\temp\";
  if (!fso.FolderExists(path)){ // 若当前路径不存在,则创建此路径。
  fso.CreateFolder(path);
  }
  path += "skin.txt"; // 创建文档的路径。
  if(!fso.FileExists(path)){
  fso.CreateTextFile(path, true);
  } // 创建新文件。
  tf = fso.OpenTextFile(path,8,true);
  tf.WriteLine(oSession.PathAndQuery.ToString());//将请求写入到文件中
  tf.Close();
  缺点:利用修改fiddle的customrules.js脚本的话,要求本机必须装有fiddler,且每次需要去修改脚本,不是很方便。
  方法三:利用jpcap抓取网络请求
  前两种方法都是利用第三方的工具抓取网络请求,那么我们能不能开发一种工具直接去抓请求呢?通过调研发现java抓取网络请求的方法jpcap,模拟arp欺骗技术,直接抓取网络层的请求。Jpcap的原理我不在这给大家卖弄了,大家可以sogou一下问问。
  我们可以使用Jpcap做哪些事儿呢?
  1.Jpcap是直接抓取经过数据链路层的数据包。因此可以自己写IP数据包直接发送给数据链路层。
  2.Jpcap会对抓取到的数据包进行一定程序的解析,根据数据包内容,将数据包封装为对应的对象()。
  3.根据用户设定的信息,过滤数据包(其实是在解析的时候,对不需要的数据直接丢弃,不解析)
  4.Jpcap 只是直接从数据链路层上读取数据,并向数据链路层中发送数据,因此,Jpcap并不能操作其他程序从数据链路层中读数据或者向网卡中发送数据。(IP层协议程序)
  小编也是经验有限,希望大家在这里可以头脑风暴一下,还有哪些好方法可以解决抓取网络请求的方法。或者在做白盒测试的时候遇见的一些问题也可以抛出来讨论一下,期待你的关注。