qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

python 的log功能

 python提供了logging模块来实现logging的功能,实现非常简单
def logTest():
import logging
import os
logger=logging.getLogger()
handler=logging.FileHandler(os.path.join(os.getcwd(),"test.log"))
formater=logging.Formatter("%(asctime)s %(levelname)s %(message)s")
handler.setFormatter(formater)
logger.addHandler(handler)
logger.setLevel(logging.NOTSET)
logger.debug("测试一下log功能")
return
  logging.getLogger()
  创建一个日志对象
  logging.FileHandler(logfile)
  创建一个日志处理器,即日志会怎样存放
  logging.Formatter()
  日志格式化
  setFormatter()
  将一个格式化信息应用到刚才创建的日志处理器上
  addHandler()
  将一个日志处理器添加到最开始创建的日志对象上
  setLevel()
  设置日志级别

posted @ 2013-10-08 11:37 顺其自然EVO 阅读(228) | 评论 (0)编辑 收藏

由点到线,关注测试进度

  作为测试人员,以前的我们每天参照图1来了解手上还有多少活。
  图1:等待测试的用户故事个数
  存在的问题:
  (1)只有故事数量导致我们看不到故事后面工作量的变化。例如,今天测试通过,关闭了3个小的用户故事,但同时今天开发提交了3个大的用户故事。从数量上看,昨天和今天的待完成工作是一样的。在这张图表的暗示下,我们有时要刻意地拒绝优先测试那些比较简单的故事以便让这个数字快速变小的诱惑。
  (2)只看目前手头还有多少未完成的工作无法让人产生太多的成就感或者紧迫感。因为伴随着每日构建,待测试的故事数此消彼长,其数量就象一个随机数,从中我们无法感知测试进度是否在可接受的范围内。还有5个用户故事没有测试?多吗?少吗?来得及吗?没人知道。
  最近,我们改为每天参照图2来了解测试进度是否健康。
  图2:测试&开发进展图
  线1:这个迭代至今测试累计完成的工作量
  线2:这个迭代至今开发累计实际已完成(已提交测试)的工作量
  线3:这个迭代至今开发累计理想需要完成(应该提交测试)的工作量
  差距1:线1和线2的差距代表测试人员追赶开发实际进度的情况
  差距2:线2和线3的差距代表开发实际进度追赶开发理想进度的情况
  好处:
  (1)关注工作量而非数量可以更实际地反应进度。除了关注测试进度,也关注开发进度其实也是确保测试进度的方式之一,因为这可以及时预防开发滞后导致测试被动的风险。
  (2)有了历史数据的趋势图,有了和另外的工作量的参照后,从图2上我们可以感到更多的成就感或者紧迫感。这有点象我们跑步的时候如果有个领跑员在身旁,往往会跑得更带劲、更有节奏。个人感觉做软件和跑步有一点不同的是,我们更多的时候追求的不是绝对速度,而是相对速度。因为绝对速度(团队生产率)的提高需要较长的时间,而保证相对速度(团队按照预期将软件产品交付使用;团队内开发按照预期的速度将软件交付测试,测试按照预期的速度将开发好的部分完成测试和缺陷修复的验证。。。)则是每个迭代都要力争的。

posted @ 2013-10-08 11:36 顺其自然EVO 阅读(145) | 评论 (0)编辑 收藏

Selenium IDE 扩展函数: 日期计算与表现

 用Selenium IDE做网页的功能测试经常会碰到与日期有关的验证,本人结合实际工作中遇到的应用,写了一个扩展,代码如下:
Selenium.prototype.doStoreDateByFormat = function(format,args){
// format of args: month,day,year
if(args.trim().length < 3)
throw new SeleniumError("arguments must contain ""Month"",""Date"",""Year"" variables!");
var formats = format.split(",");
var days = parseInt(formats[3]);
var sysDate = getSysDate(); //get the sysdate
var specDate = dateAfterDays(sysDate,parseFloat(days),1); //get specified date
var arrArgs = args.split(",");
var month = specDate.getMonth()+1;
var date = specDate.getDate();
var year = specDate.getFullYear();
// get Month string
switch(formats[0].toUpperCase()){
case "MM": // return 2 digits of month number, such as: 01
month = (month+"").length==1?"0"+month:month;
break;
case "MMM": //return the first 3 chars of the month word, such as: Jan
month = this.getMonthShortName(month);
break;
case "MMMM": //return the full word of the month word, such as: January
month = this.getMonthFullName(month);
break;
case "M":
default:
// return 1 digit when month is lower than 10.
// do nothing
}
//get Date string
switch(formats[1].toUpperCase()){
case "DD": //always return 2 digits of the month number, such as: 05
date = (date+"").length==1?"0"+date:date;
break;
case "D":
default:
// return 1 digit when Date is lower than 10.
// do nothing
}
//get Year string
switch(formats[2].toUpperCase()){
case "YY": // return last 2 digits of the year number, such as: 08 (2008)
year = (year+"").substr(2);
break;
case "YYYY":
default:
//return full year number, such: 2008.
}
storedVars[arrArgs[0]] = month;
storedVars[arrArgs[1]] = date;
storedVars[arrArgs[2]] = year;
}
Selenium.prototype.getMonthFullName = function(month){
var monthArr = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
if(month == null){
throw new SeleniumError("you didn't specify a Month");
}
try{
month = parseInt(month);
}catch (e){
throw new SeleniumError("""Month"" is not a Integer!");
}
return monthArr[month-1];
}
/* return the date N days(N*24 hours) before/after some day.
* args   :   num - positive/negative integer/float number,default is "1";
*            type - 0 (second) or 1 (day), default is second.
* return :   Date
*/
function dateAfterDays(date, num, type){
date = (date == null?new Date():date);
num = (num == null?1:num);
if(typeof(num)!="number")
throw new SeleniumError("dateAfterDays(date, num, type),""num"" argument must be Number type.");
if(typeof(date)!="object")
throw new SeleniumError("dateAfterDays(date, num, type),""date"" argument must be Date type.");
var iType = (type == null?0:type);
var arr = [1000,86400000];
var dd = date.valueOf();
dd += num * arr[iType];
var d=new Date(dd);
return d;
}
function getSysDate(){
return new Date();
}
  使用方法如下,详见以上代码

01
01

posted @ 2013-10-08 11:35 顺其自然EVO 阅读(260) | 评论 (0)编辑 收藏

linux 怎么完全卸载mysql数据库

 a)查看系统中是否以rpm包安装的mysql
  [root@linux ~]# rpm -qa | grep -i mysql
  MySQL-server-5.1.49-1.glibc23
  MySQL-client-5.1.49-1.glibc23
  卸载MySQL-server-5.1.49-1.glibc23和MySQL-client-5.1.49-1.glibc23
  [root@linux ~]# rpm -e MySQL-client-5.1.49-1.glibc23
  [root@linux ~]# rpm -e MySQL-server-5.1.49-1.glibc23
  b)查看有没有mysql服务
  [root@linux ~]# chkconfig --list | grep -i mysql
  mysql           0:off   1:off   2:on    3:on    4:on    5:on    6:off
  删除mysql服务
  [root@linux ~]# chkconfig --del mysql
  c)删除分散mysql文件夹
  [root@linux ~]# whereis mysql
  mysql: /usr/lib/mysql /usr/share/mysql
  分别删除
  [root@linux lib]# rm -rf /usr/lib/mysql/
  [root@linux lib]# rm -rf /usr/share/mysql

posted @ 2013-10-08 11:33 顺其自然EVO 阅读(450) | 评论 (0)编辑 收藏

学习Java开源框架前你应该了解的

不要上来就学Struts/WebWork/Spring/Hibernate/iBATIS等等框架,先了解一下下面一些技术,对于学习框架来说是十分重要的。
  一是Java的反射机制和自省机制。大部分框架都用到这两种机制,因为它们都要实现通过配置文件自动完成类的识别和加载,所以必须要使用反射和自省。尤其是自省机制,对于大家了解JSP中的一些知识也是很有帮助的。比如,如果在EL中使用
  ${user.name}
  那么,user这个对象中如果没有name这个属性行不行?
  还有,是不是Java私有的成员就一定不能访问?
  二是设计模式。GOF的23种模式很重要,这已经不用再多说了。每一种框架都用到了数种设计模式,如果你不懂设计模式,它们的源代码很难看懂。比如,JUnit中就用到好多种设计模式,毕竟是Gamma做的。包括Composite、Command、Decorator等等。
  三是代理机制。代理对于实现一些附加功能非常有帮助,在Hibernate中大量地使用到了代理机制。代理机制有两种,一是Java内置的Proxy,二是CGLIB框架提供的代理。倒不用全懂,但至少得知道代理是个什么意思。要不即使你会用了,也不会理解它们是如何实现的。
  四是XML。一定要会写,对于他的解析,能够了解最好了。两种方法,DOM和SAX;两种框架dom4j、digister等等
  我觉得最重要的是基础知识一定要好.我推荐看java编程思想这本书,很多公司笔试的java方面的题目出自这本书.另外JSP,SERVLET,JDBC一定要有所了解,这个能说明你在大学的时候实习过,做过一些小项目的.HIBERNATE,STRUTS,SPRING这些东西我不推荐你去学习,我觉得你应该学习如何处理异常,学会用JDBC访问数据库,学会如何释放资源,如何控制数据库事务,学会如何写自定义标签,这样能够显著的提高你的编程水平.
  工作一年的后我觉得应该回过去看看大学的数据结构,算法,操作系统,然后应该对面象对象要有更深刻的理解,设计模式也应该慢慢开始涉及到(JAVA变编程思想这本书建议多看几次).我不建议工作一年就开始换工作,因为找工作要花时间,新工作就要适应新的框架和新的业务,这样你就会乱费很多时间的.我还是不建议你去看HIBERNATE,STRUTS,SPRING这样的东西,虽然你工作中可能要用到它.对于英语我觉得应该早做准备,强迫自己看一些英文方面的书籍,提高自己的口语水平,另外我还要强调一点,适当的参加培训是很有必要的,上海有很多的外语培训机构(主要是培训商务交流),效果很不错的,不过也很贵的,所以去前一定要计划好,不要象大学那样交了钱不去上课或者不认真听课,那样就最好先不要去.
  工作两年后,如果你算法,数据结构,设计模式等等有比较深的了解的时候 我觉得HIBERNATE,STRUTS,SPRING的实现方法你应该能够很快理解.

posted @ 2013-10-08 11:33 顺其自然EVO 阅读(240) | 评论 (0)编辑 收藏

操作系统中睡眠、阻塞、挂起的区别形象解释

“阻塞(pend)”与“挂起(suspend)”的区别? [
  操作系统中睡眠、阻塞、挂起的区别形象解释
  首先这些术语都是对于线程来说的。对线程的控制就好比你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。
  挂起线程的意思就是你对主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。
  使线程睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。
  线程阻塞的意思就是,你突然发现,你的雇工不知道在什么时候没经过你允许,自己睡觉呢,但是你不能怪雇工,肯定你这个雇主没注意,本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。至于扫帚回来后,雇工会不会知道,会不会继续干活,你不用担心,雇工一旦发现扫帚回来了,他就会自己去干活的。因为雇工受过良好的培训。这个培训机构就是操作系统。
  ——————————————————————————————————————————————
  我是这么认为的:
  挂起和阻塞,使进程失去CPU,阻塞一般是被动的需要等待资源,而挂起可以被别的进程给抢占导致挂起,也可以自己主动挂起自己。阻塞一般是TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE,而挂起除了这两个,还可以是TASK_RUNNING。
  ——————————————————————————————————————————————
  挂起是主动的,一般需要用挂起函数进行操作,若没有resume的动作,则此任务一直不会ready。而阻塞是因为资源被其他任务抢占而处于休眠态。两者的表现方式都是从就绪态里“清掉”,即对应标志位清零,只不过实现方式不一样.

posted @ 2013-10-08 11:32 顺其自然EVO 阅读(277) | 评论 (0)编辑 收藏

web前端性能分析--实践篇

当我们知道了web前端性能的关键点后,那么接下来要做的就是如何去具体实施并获取这些关键点的数据了。通过前面的学习知道了不少好的工具,经过对比后个人觉得dynatrace还是不错的。
  不仅支持ie,ff浏览器,还具备js函数级别的优化分析,它的分析数据也是最全面的,分析数据可以导出,最后和yslow,pagespeed一样支持向showslow上面传送结果信息这样就节省了很多的事情了。所以实施方案具体确定为dynatrace用来捕获web前端页面访问的性能数据,然后上传至showslow来浏览测试结果。
  dynatrace安装与使用
  1、下载并安装dynatrace ajax edition
  2、从开始--》程序就可以打开该工具
  3、启动IE后默认状态是没有连接到dynatrace
  4、点击ie上dynatrace插件的最左边的连接
  5、连接成功后会自动刷新当前url页
  6、此时刷新dynatrace工具界面上的browser节点
  7、载入测试数据成功后就能看到数据分析图表
  showslow站点的安装
  showslow是一个开源的php项目,主要用来展示多个测试工具的性能数据,比如yslow等。它有一个线上版的,也支持你下一个源码在自己的公司搭建一个本地版showslow。所以这里我们会搭建一个自己私人的showslow站点。
  1、下载showslow,并解压到一个本地目录
  2、下载搭建showslow站点的其他支撑程序,如web服务器、php、mysql等
  3、下载apache2.2,,nginx也可以,其它的支持php执行的web服务器都行【但是配置可能有点麻烦】
  4、下载php程序,最好是5.3的,而且是线程安全的版本【不然有些模块没有,而且安装时选择apache 2.2 x-modle,以及安装扩展插件】
  5、下载mysql5.5及以上的,这个默认安装的选项就可以了
  配置各支持程序:
  官方说明链接:http://www.showslow.org/Installation_and_configuration
  apche配置:
  1、先测试一下默认的安装后是否可以工作
  2、修改httpd.conf配置文件
  3、去掉以下3个模块加载的注释符号: mod_deflate, mod_rewrite and mod_expires
  4、添加一行模块加载语句LoadModule php5_module "x:/.../php/php5apache2_2.dll"
  5、添加以下2种web的请求类型页:【在<IfModule mime_module>标签之间】
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php .phtml
  6、在文档最下方添加一行php配置文件的目录:PHPIniDir "x:/.../php"
  7、修改DocumentRoot的路径为你解压showslow的目录【记住是有两处,还有一个在<Directory >标签处】
  8、为DirectoryIndex添加一个默认的php浏览文件:形如:DirectoryIndex index.php
  9、浏览以下index.php页,如果显示了php源码文件内容,则上述配置没有什么大问题
  php配置:
  1、打开php安装目录中的配置文件php.ini
  2、取消以下2个扩展模块的注释符号:php_mysql.dll,php_mysqli.dll
mysql配置:
  1、测试mysql是否安装正确
  2、给showslow创建数据库
[sql] view plaincopy
$ mysql -u root -p
mysql> create database showslow;
mysql> grant usage on showslow.* to showslowuser@localhost identified by '... database-password ...';
mysql> grant all privileges on showslow.* to showslowuser@localhost;
mysql> quit
[sql] view plaincopy
$ mysql -u root -p
mysql> create database showslow;
mysql> grant usage on showslow.* to showslowuser@localhost identified by '... database-password ...';
mysql> grant all privileges on showslow.* to showslowuser@localhost;
mysql> quit
  3、修改showslow解压目录下的config.sample.php文件名为config.php
  4、修改该文件的数据库连接信息,按照上面创建的数据库名,用户名,密码即可
  5、给showslow创建表结构,通过运行showslow解压主目录下的dbupgrade.php和users子目录下dbupgrade.php文件【如果是在linux下可以在主目录运行make命令即可】
  ok,现在所有的配置都已经完成了,可以再次访问我们配置的网址,是不是已经可以正常访问了。
  集成dynatrace和showslow:
  2个程序单独的都已经安装完成就可以合作使用了,其实集成就是在dynatrace主程序界面,或者叫代理界面中进行一个上传操作即可。
  1、点击查看之前录制的性能数据的概要页面
  2、在右边上方窗口中选择一个url地址
  3、右键之,选择上传至showslow.com
  不过点过之后应该没有起到作用,因为还需要在dynatrace的配置文件添加一些配置:
  1、打开dynatrace的配置文件dtajax.ini,在安装目录
  2、添加如下配置行
  -Dcom.dynatrace.diagnostics.ajax.beacon.uploadurl=http://www.showslow.com/beacon/dynatrace
  -Dcom.dynatrace.diagnostics.ajax.beacon.portalurl=http://www.showslow.com/
  第一行为上传的位置,即数据传输到哪;其实是指向了一个php文件,这个文件用来接收发送过去的json字符串,并存储在showslow的数据库中
  第二行为手动上传后提示你打开showslow页面查看数据分析时的url地址
  3、现在再去上传一次,然后去showslow首页刷新一次
  集成到自动化测试的环境中:
  让dynatrace自动上传数据:
  其实dynatrace没有任何的外部标准接口可以被自动化所调用,但是却提供了一些简单的可配置的选项,比如可以在dtajax.ini文件中配置自动上传,
  具体为添加如下行即可:
  -Dcom.dynatrace.diagnostics.ajax.beacon.autoupload=true
  让自动化测试执行时自动捕获网页浏览数据:
  还有一个可以配置dynatrace的地方就是环境变量,因为当浏览器安装了dynatrace的插件后,每次启动插件都会去检查特定的环境变量,若其值等于特定的配置则会
  作为初始化为插件的参数;而其中就有环境变量支持作为工具的开关功能,在运行自动化测试时可以通过控制这些环境变量的值就可以间接的控制dynatrace了。
  因版本不同会有不同的环境变量名,具体可以看一下这里。https://apmcommunity.compuware.com/community/display/AJAXFORUM/Automation+with+dynaTrace+AJAX+Edition
  其中3.x的环境变量如下:
  DT_AE_AGENTACTIVE=true
  DT_AE_AGENTNAME="any string name"
  这样你启动的每一个浏览器实例都会默认打开dynatrace的代理功能,所以整个自动化的测试过程中的所有页面访问数据都会被收集,同时在你测试完成关闭浏览器之后会
  自动发送所有数据到指定的showslow上面,测试结束后还可以发送邮件给相关人员去showslow上直接查看即可。
相关文章:
web前端性能分析--原理篇

posted @ 2013-09-30 11:33 顺其自然EVO 阅读(392) | 评论 (0)编辑 收藏

关于loadrunner的pacing值的总结

 之前一直也用pacing值来调节TPS,一直觉得它和think time没啥区别.这次项目中,和同事就此展开了讨论,细细一研究发现pacing值门道还是很多的.
  如下面三个图:
  上图是pacing的三个选项,如果选第一项 "As soon as the previous iteration ends",那么就是没有间隔的,也就是pacing值不生效.
  选这项的话,意义为: 当上次迭代结束后,等待一定时间再进行下次迭代
  注意,选择这项的话设置:从上一次迭代开始到本次迭代开始的时间,此时和相应时间的关系是:

posted @ 2013-09-30 11:32 顺其自然EVO 阅读(250) | 评论 (0)编辑 收藏

单元测试Struts2的Action(包含源码)

 很久没有从头搭建Struts2的环境了。最近,认真实践了单元测试Struts2、Spring等Java项目。
  今天特意写的是单元测试Struts2的Action,遇到了不少问题,果然是实践出真知啊。
  从搭建环境、写代码到写这篇文章,一共花了90分钟。
  特别说明:本文是原创,搭建环境、写代码、运行,都是实践并且正确的。
  本文是靠谱的,而非简单的复制-粘贴。
  1.新建工程,加入相关jar包。
  struts.core等struts自己的jar包
  spring-core-3.2.0.RELEASE.jar
  (用到了里面的一些类,比如看起来挺奇怪的,测试Struts2怎么和Spring扯上关系了。
  没有这个包,会报错java.lang.NoClassDefFoundError: org/springframework/core/io/ResourceLoader)
  spring-test-3.2.3.RELEASE.jar
  Junit的jar包
  Tomcat的Server Rumtime lib。
  2.新建Action。
public class UserAction {
public String list(){
return "success";
}
}
  3.新建单元测试
package unittest;
import org.apache.struts2.StrutsTestCase;
import org.junit.Test;
import action.UserAction;
import com.opensymphony.xwork2.ActionProxy;
public class ActionUnitTest extends StrutsTestCase {
// 重写父类方法,指定配置文件的名字
protected String[] getContextLocations() {
return new String[] { "struts.xml" };
}
@Test
public void testExecute() throws Exception {
ActionProxy proxy = getActionProxy("/unitTest");
UserAction test = (UserAction) proxy.getAction();
assertNotNull(test);
String result = proxy.execute();
assertEquals("success", result);
}
}


 4.Struts配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!– Development Mode –>
<constant name="struts.devMode" value="true" />
<package name="manager" namespace="/" extends="struts-default">//不是default
<action name="unitTest" class="action.UserAction" method="list">
<result name="success">unitTest.jsp
</result>
</action>
</package>
</struts>
  5.访问web页面测试。
  需要在Web.xml中增加
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
访问URL:http://localhost:8080/Struts2UnitDemo/unitTest.action

posted @ 2013-09-30 11:32 顺其自然EVO 阅读(372) | 评论 (0)编辑 收藏

推荐10款免费的在线UI测试工具

摘要:网站测试是网站发布前至关重要的一步。其对SEO、搜索引擎排名、转换率、跳出率、安全性提高等都有重要的影响。W3C Markup Validation Services、Watcher、Selenium、Browsershots等工具,可帮助迅速完成测试工作
  发布网站之前至关重要的一步是网站测试。网站测试要求我们全面地运行网站并通过所有基本测试,如响应式设计测试、安全测试、易用性测试、跨浏览器兼容性、网站速度测试等。
  网站测试对SEO、搜索引擎排名、转换率、跳出率(Bounce Rate)、网站页面设计、安全性的提高等都有重要的影响。所以对于Web开发人员,在发布网站之前对其进行测试至关重要。
  有很多优秀的工具正被Web开发者用来进行网站测试。本文将例举10款优秀的网站测试工具
  W3C Markup Validation Services
  W3C验证器可以检查任何网站中的HTML标记,并显示与其标准不符的错误之处。还有与W3C验证相关的诸多功能,如功能检查、跨浏览器兼容性、Web页面加载速度、简单维修、更好的搜索引擎排名等。
  PageSpeed Insights
  速度是任何网站最重要的特征。当前,每个人都希望网站加载速度尽可能快。PageSpeed Insights是一个在线网站速度测试工具,检查完网站之后,还可给出提高网站速度与性能的策略。
  Browsershots
  Browsershots用来检测网站的跨浏览器兼容性。它是一款开源的在线Web应用,可获得来自各种浏览器及操作系统的屏幕截屏。
  Web Accessibility Checker (AChecker)
  AChecker为开源的Web易用性检测工具。它于2009年由多伦多大学的包容性设计研究中心(Inclusive Design Research Centre)开发。它可用来发现HTML的可用性问题。利用该工具,你必须提交Web页面的URL,或者上传HTML文件,或者复制粘贴整个HTML源代码。
 Watcher

  Watcher为Fiddler重要扩展,可用来发现网站的安全问题。它对基于HTTP的Web应用进行扫描,“Passive”意味着它对云计算、主机托管位置不存在危险因素。
  AccessColor
  AccessColor用来测试DOM文档中前、后台所有因素的颜色亮度与颜色对比度。它可用来发现HTML & CSS文档中合适的颜色搭配。
  Selenium
  Selenium是针对Web应用的开源测试框架。它基于Java脚本,提供一系列选择,组成了一个全面的自动化测试套件。
  Solex
  Solex,作为HTTP代理,是一个开源的Web测试工具。它被用作EclipseIDE的插件。它可记录下客户端与服务器端所有的HTTP请求与应答。

 Ettercap

  Ettercap是一个免费的Web安全保护工具。 它可获取密码、打断网络上的传输、无用内容的清理等功能。它可用来检查计算机网络协议,及进行安全保护检测。
  Screenqueri.es


  Screenqueri.es为免费的响应式设计测试应用。它提供了30个不同的设备预设,以检测网站的响应式设计。你可以验证采用传统解决方案的设计,可修改设计安排,并验证该设计是否可工作。(编译:陈秋歌 审校:张红月)
  原文链接: 10 Free Online UI Testing Tools For Web Designers and Developers

posted @ 2013-09-30 11:31 顺其自然EVO 阅读(426) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 199 200 201 202 203 204 205 206 207 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜