安全测试就是要提供证据表明,在面对敌意和恶意输入的时候,应用仍然能够充分的满足它的需求。
a.如何提供证据? 我们通过一组失败的安全
测试用例执行结果来证明
web应用不满足安全需求。
b.如何看待安全测试的需求?与
功能测试相比,安全测试更加依赖于需求,因为它有更多可能的输入和输出可供筛选。
真正的软件安全其实际上指的是风险管理,即我们确保软件的安全程度满足业务需要即可。
2. 如何开展(How to)?
基于常见攻击和漏洞并结合实际添加安全测试用例,就是如何将安全测试变为日常功能测试中简单和普通的一部分的方法。
选择具有安全意义的特殊边界值,以及具有安全意义的特殊等价类,并将这些融入到我们的测试规划和测试策略过程中。
但是若在功能测试基础上进行安全测试,则需要增加大量测试用例。这意味着必须做两件事来使其便于管理:
缩小关注的重点和测试自动化。
黑盒安全测试自动化的实施:
使用工具:
1.wapiti
a.简介:wapiti:开源安全测试漏洞检测工具(Web application vulnerability scanner / security auditor)
Wapiti allows you to audit the security of your web applications. It performs "black-box" scans, i.e. it does not study the source code of the application but will scans the web pages of the deployed web applications, looking for scripts and forms where it can inject data. Once it gets this list, Wapiti acts like a fuzzer, injecting payloads to see if a script is vulnerable. Wapiti can detect the following vulnerabilities: File Handling Errors (Local and remote include/require, fopen, ...) Database Injection (PHP/JSP/ASP SQL Injections and XPath Injections) XSS (Cross Site Scripting) Injection LDAP Injection Command Execution detection (eval(), system(), passtru()...) CRLF Injection (HTTP Response Splitting, session fixation...) |
---------------------------------------------------------------------------------------
功能和特点:
文件处理错误(本地和远程打开文件,readfile ... )
数据库注入(PHP/JSP/ASP,SQL和XPath注入)
XSS(跨站点脚本)注入
LDAP注入
命令执行检测(eval(), system(), passtru()...)
CRLF注射入(HTTP响应,session固定... )
----------------
统计漏洞数量
成功袭击的细节
漏洞详细信息
提供解决漏洞的方法
HTML报告格式
XML报告格式
b.使用:wapiti使用比较简单,官网上给出的命令行及参数如下:
Usage Wapiti-2.2.1 - A web application vulnerability scanner Usage: python wapiti.py http://server.com/base/url/ [options] Supported options are: -s --start To specify an url to start with ---------- -x --exclude To exclude an url from the scan (for example logout scripts) You can also use a wildcard (*) Example : -x "http://server/base/?page=*&module=test" or -x http://server/base/admin/* to exclude a directory ---------- -p --proxy To specify a proxy Exemple: -p http://proxy:port/ ---------- -c --cookie To use a cookie ---------- -t --timeout To fix the timeout (in seconds) ---------- -a --auth Set credentials for HTTP authentication Doesn't work with Python 2.4 ---------- -r --remove Remove a parameter from URLs ---------- -n --nice Define a limit of urls to read with the same pattern Use this option to prevent endless loops Must be greater than 0 ---------- -m --module Set the modules and HTTP methods to use for attacks. Example: -m "-all,xss:get,exec:post" ---------- -u --underline Use color to highlight vulnerables parameters in output ---------- -v --verbose Set the verbosity level 0: quiet (default), 1: print each url, 2: print every attack ---------- -f --reportType Set the type of the report xml: Report in XML format html: Report in HTML format ---------- -o --output Set the name of the report file If the selected report type is "html", this parameter must be a directory ---------- -i --continue This parameter indicates Wapiti to continue with the scan from the specified file, this file should contain data from a previous scan. The file is optional, if it is not specified, Wapiti takes the default file from \"scans\" folder. ---------- -k --attack This parameter indicates Wapiti to perform attacks without scanning again the website and following the data of this file. The file is optional, if it is not specified, Wapiti takes the default file from \"scans\" folder. ---------- -h --help To print this usage message ------------------------------------------------------------ |
注:将wapiti的执行写入到shell脚本中,由计划任务定时去跑该脚本。
然后将wapiti生成的报告以邮件形式发到测试执行者指定的邮箱即可。
shell 脚本按行读取文本文件url(待测页面),交由wapiti执行测试。将结果输出到generated-report.txt文件。
用javamail发送report邮件到指定邮箱,测试执行结束。具体如下:
#! /bin/bash count=1 cat url | while read line do echo "------$(date)------" wapiti $line >>generated-report.txt echo "execute $count complete" count=$(($count + 1)) done exit 0 |
3.如何评价(How to audit)?
黑盒安全测试一般是在黑盒功能测试、性能测试完成之后进行。可参考微软的SDL(Security Development Lifecycle)
流程。感觉在日常测试工作中加入黑盒安全自动化测试最易实施,效果可能也最好。从流程、组织、技术三方面保证
测试质量。评审或是评价安全测试的活动,没有资格说,做过再说。
Tomcat下配置JNDI数据库连接池并使用
一、配置JNDI数据源
这一步有几种配置方式,比如直接修改Tomcat/conf/server.xml文件,但这样修改是全局的,个人不太喜欢这样的方式,本着的原则是能不全局就不全局,以保证项目能够尽量少的影响到其他项目,尽量少的进行修改。因此这里才用局部配置的方式。
把下边的代码保存为context.xml文件,并放到WebRoot/META-INF目录下。
<!-- 根据实际情况修改 --> <Context> <Resource name="jdbc/test" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" username="root" password="root"/> </Context> |
<servlet> <servlet-name>Test</servlet-name> <servlet-class>com.nantian.jndi.Test</servlet-class> <init-param> <param-name>jndi</param-name> <param-value>java:comp/env/jdbc/test</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Test</servlet-name> <url-pattern>/Test</url-pattern> </servlet-mapping> |
新建一个Servlet文件
Test.java,写下如下内容
package com.nantian.jndi; import java.sql.Connection; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.sql.DataSource; public class Test extends HttpServlet { public void init(ServletConfig config) throws ServletException { String jndi = config.getInitParameter("jndi"); try { Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup(jndi); Connection conn = ds.getConnection(); System.out.println("连接获取成功:"+conn); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } |
这样就可以了测试了,这个例子连接的是mysql数据库,别忘记添加mysql驱动的jar包。部署工程,运行Tomcat,在服务器启动的时候就可以看到System.out.println("连接获取成功:"+conn);这条语句输出的信息了。
全球有260万信息安全专业人士,
渗透测试工具是他们“安全军火库”中最常使用的装备,但直到最近,可用的渗透测试工具才丰富起来,但这也带来一个问题,挑选合适的渗透测试工具成了一件麻烦事,一个最简单的方法就是参考同行们的选择。
近日一位国外信息安全专家发起了一项渗透测试工具在线调查,来自世界各地超过700名安全专家参与了调查,目前调查尚在进行中,但是一些类别工具的流行度差异已经可以比较明显地看出来。安全牛将其中一些调查结果摘录在下面供大家参考:
参与调查人员的职业分布,渗透测试专业人士居多
最常使用的渗透测试框架,Metaspoit遥遥领先(82%):
最常使用的计算终端,笔记本电脑占大多数(71%):
最常使用的密码/网络破解工具,John The Ripper最受欢迎(37%):
简介
Sikuli 是一种新颖的图形脚本语言,或者说是一种另类的
自动化测试技术。它与我们常用的自动化测试技术(工具)有很大的区别。
当你看到上图sikuli的脚本时,一定会惊呼,这样都可以~!脚本加截图~~~
OK ,在惊讶过后,我们一起来大体的了解一下这个技术。
什么是Sikuli?
Sikuli脚本自动化,你在屏幕上看到的任何东西。它使用图像识别,识别和控制GUI组件。这是有用的,当有一个GUI的内部或源代码的访问是不容易的。
Sikuli(在墨西哥维乔印第安人的语言里是”上帝之眼”的意思)是由美国麻省理工学院开发的一种最新编程技术,使得编程人员可以使用截图替代代码,从而简化代码的编写流程。从它研究方向上看,是一种编程技术,但是该技术还可以用于进行大规模的程序测试,脚本程序编写使用的是
python语言。
谁正在开发的Sikuli脚本?
Sikuli是一个开放源码的最初的用户界面设计组织 在麻省理工学院的研究项目 。现在是保持并进一步 协调与开源社区开发的Sikuli实验室在美国科罗拉多州博尔德大学。这是支持的,部分由国家科学基金会奖IIS-0447800,广达电脑的一部分的TParty项目。Sikuli 的MIT许可证下发布的 。
好吧~!你觉得
谷歌浏览器翻译的太烂(但对我这种E文件菜鸟来说知道意思就行),那么可以去官网看英文介绍:
http://www.sikuli.org/
Sikuli 可以采用Python 来做为脚本语言, 当然,你如果熟悉Python 的话,相信你对sikuli 的上手非常快。当然,你也可以使用sikuli的
java API 使其在java 环境下运行。
下载安装
是否有兴趣与俺一起体验一下呢?
来下载页面看看http://www.sikuli.org/download.html
好吧~!这货已经发生了不小的改变,去年玩的时候还是“单纯”的一下小软件。现在好像要求变多了。
Sikuli 告诉我们目前只有32位的版本,不过这个版本应该也可以运行在32位与64的windows系统下。但是,是有前提条件地:
1、请确保你已经安装java 6 JRE 32位版本(如果是java 7 或者是64位JRE 那是不被支持的)
2、请确定你已经卸载的先前的sikuli版本(尤其是0.10.x版本)
3、请确保在你安装 JRE 或 卸载旧版本的sikuli 后已经重新启动了系统。
安装步骤:
一、就在上面提供的下载页面,点击“ Sikuli X-1.0rc3(R905)-win32.exe”下载安装。程序很小,比起
QTP 等工具,就可以直接忽视了。
我的安装路径:I:\Program Files (x86)\Sikuli X
二、 安装完成后先不在不要运行,输因为他还有点小毛病,我们需要在下载页面找到“Sikuli X R930 ”连接,把这个zip类型的文件下载下来。
三、 我们将下载的文件sikuli-r930-win32.zip解压,然后得到一个SIKULI-IDE 的目录,把SIKULI-IDE目录下的所有文件替换Sikuli X下的所有文件。(这种做法有点2了!)做这一步的目的是r930关联文件修复了了最近的bug ,所以替换r905(有问题版本)文件关联。希望官方进快对下载版本修复,在你看到这篇
文章再去下载安装时不用这么麻烦了。
界面介绍
上面已经安装完成,下面运行起来看看长相如何。
(注意窗口标题栏显示为“sikuli -r930”说明我们用的是替换版本)
菜单栏与工具栏非常简单,下面介绍一下这几个按钮是干嘛用的
屏幕截图(Take screenshot):点击该按钮,进入屏幕截图状态,拖拽辅助线选取需要截取的界面元素,释放鼠标左键的同时,自动将该截图插入到编辑区中光标当前位置。使用快捷键 Ctrl+Shift+2(Command+Shift+2)也可激活截图状态,以完成对于弹出菜单、下拉框一类的控件的实时截图。该快捷键亦可通过主菜单 File->Preferences 进行自定义。
插入图片(Insert image):除直接截图外,用户也可通过点击该按钮导入已有的 PNG 格式图片文件。
建立屏幕区域(Create region):点击该按钮,进入屏幕区域选择状态,拖拽定位十字线选取屏幕区域。释放鼠标左键,即可将当前选中区域的屏幕坐标信息插入到编辑区中。
运行(Run):点击执行当前脚本。快捷键为 Ctrl+R(Command+R)。
慢速运行(Run in slow motion):点击后以较慢的速度执行当前脚本,以红色圆形外框显式标识每一次图像查找定位动作,便于程序调试中进行焦点追踪。快捷键为 Ctrl+Alt+R(Command+Alt+R)。
左侧侧边栏中分类列出了部分常用函数,点击函数名可快速将其插入到编辑区,若该函数需截图作为参数,则自动转入屏幕截图状态。下方的状态栏可用于查看当前行号,与行首 Tab 缩进的层级 ( 列号 )。
右边区域上半部分为脚本编辑区域,我们的自测化测试脚本就是在这个区域编写完成。
下半部分为提示信息,不管运行成功与失败,都会给出相应的提示信息
小例子
大体上了解sikuli 的界面,下面来做一个自动化的小例子。(官方的第一个小例子为开始运行里输入hello world )这里为打开360极速浏览器(默认为百度首页),搜索框里输入sikuli ,然后点击“百度一下”按钮搜索。
第一步、点击桌面360极速浏览器图标。
方法一,输入双击函数doubleClick(),然后通过截图工具对桌面图标截图,输入。
方法二很快捷,点击窗口左侧双击函数doubleClick(),直接进入截图状态。截图完成后直接添加函数到脚本编辑区域。
第二步,我们依然用第二种快捷的方式,点击左侧type(图标,text) 函数,这次截取的对象为百度首页的输入框。
因为,默认定位的焦点为图片的中心,我们要输入的位置在输入框的左侧,所以需要对焦点进行调整。直拉点击截图的输入框图片。
当然,在这个窗口中,我们也可调整图片的匹配度,匹配度越低容错能力越强。这里来简单解释一下:
大家知道ie7 与 ie8 的图标虽然相似,但还是有所差别的。为了使脚本的移植性更强。比如本机是用IE7 录制的脚本,移植到另一台电脑上只有IE 8 ,因为精确度调低,脚本也会把IE8 当IE 7 来执行。当然有些情况下调低并不好,比如桌面上有两个图标非常相识,那么精确度调整的很低,那么脚本就无法辨认谁是谁了。
第三步、这一步与第一步一样,不过这里要使用的函数是单击函数click() ,点击“百度一下”按钮。
下面完整脚本:
运行一下吧这个小脚本吧!成就感就此而生,这是你对这种技术产生兴趣的动力。。
优缺点
了解一下这个工具的优缺点会让你更正确的使用这个工具
优点
1、整体上sikuli小巧、便捷、容易上手。
2、sikuli脚本可以不经过API的编译器直接自动化搜索到任何你能在屏幕上看到的东西
3、对各种程序都适合
4、不存在标准控件和非标准控件的问题
5、相对位置概念较小,要求不高(但是对象本身尺寸有影响)
6、一次编码,多次运行(基于java的) 7、jython和java的支持,用编程的方式比较容易扩展
缺点
1、图片的分辨率、色彩、尺寸、唯一性对程序的影响 (如果有两个相同的,无法区分具体哪一个)
2、sikuli本身还不完善(处于开发、升级阶段) 还有很多程序bug,能否继续发展还是未知数
3、只认识当前活动的图标(只有当前桌面有才行)
4、用例组织方面有提供但是目前有bug,还未调研尝试便利性
5、截图的话,脚本存储占用空间较大
6、相似度调整需要手动一个个的调整,工作量大
7、ljw200901t和ljw200902t的区别(不太容易区别出来,可能需要调整到similarity=1.0才行,但这样的话可移植性就差了)
8、目前还不适合设计成一种测试框架(有用例组织功能,但是目前有bug,暂时没有用过)
9、测试报告的生成,直接用message的话比较弱,需要用jython编程实现可能会强大一些(还未调研)
<!DOCTYPE html> <html lang="en"> <head> <title>testAll</title> <link href="css/bootstrap.min.css" rel="stylesheet" /> <link href="css/prettyCheckable.css" rel="stylesheet" > <link href="css/select2.css" rel="stylesheet"/> <script type="text/javascript" src="js/jquery-2.0.3.min.js"></script> <script type="text/javascript" src="js/bootstrap.min.js"></script> <script type="text/javascript" src="js/bootstrap.file-input.js"></script> <script type="text/javascript" src="js/prettyCheckable.min.js"></script> <script type="text/javascript" src="js/select2.js"></script> <style type="text/css"> <!-- .STYLE1 { color: #FF0000; font-size: 18px; } .STYLE2 {color: #FF0000} .STYLE3 { font-size: 18px; font-weight: bold; color: #FF0000; } --> </style> </head> <body style="margin:auto 50px;"> <span class="STYLE1">一、fileupload(bootstrap.file-input) </span><br> <span class="STYLE2">js:</span><br> jquery-2.0.3.min.js<br> bootstrap.min.js<br> bootstrap.file-input.js<br> <span class="STYLE2">css:</span><br> bootstrap.min.css<br> <!-- Change the wording using a title tag --> <input type="file" title="Search for a file to add 1" class="btn-primary"> <br> <br> <input type="file" title="Search for a file to add 2" class="btn btn-primary"> <br> <br> <input type="file" title="Search for a file to add 3" class="btn-primary"> <br> <br> <input type="file" title="Search for a file to add 4" class="btn-primary"> <br> <br> Disable the styling: <!-- Disable the styling --> <input type="file" data-bfi-disabled> <script type="text/javascript"> $('input[type=file]').bootstrapFileInput(); </script> <br><br><br> <span class="STYLE1"><strong>二、checkbox&radio(prettyCheckable) </strong></span><br> <span class="STYLE2">js:</span><br> jquery-2.0.3.min.js<br> prettyCheckable.min.js<br> <span class="STYLE2">css:</span><br> prettyCheckable.css<br> <br> <span class="STYLE2">checkbox:</span><br> <input type="checkbox" class="myClass" value="1" id="answer" name="answer" data-color="green"/> <input type="checkbox" class="myClass" value="2" id="answer" name="answer" data-color="red"/> <br> |
<span class="STYLE2">radio:</span><br> 第一组:<br> <input type="radio" class="myRadio" value="1" id="myRadio" name="radio" data-color="green"/> <input type="radio" class="myRadio" value="2" id="myRadio" name="radio" data-color="red"/> <br>第二组:<br> <input type="radio" class="myRadio" value="1" id="myRadio2" name="radio2" data-color="green"/> <input type="radio" class="myRadio" value="2" id="myRadio2" name="radio2" data-color="red"/> <script> $().ready(function(){ $('input.myClass').prettyCheckable({ color: 'red' }); $('input.myRadio').prettyCheckable({ color: 'red' }); }); </script> <br><br><br> <span class="STYLE3">三、select(select2) </span><br> <span class="STYLE2">js:</span><br> jquery-2.0.3.min.js<br> select2.js<br> <span class="STYLE2">css:</span><br> select2.css<br> <br> <br> <span class="STYLE2">select2多选下拉: </span><br> <select class="multipleSelect" multiple style="width:300px"> <option value="1">Mustard</option> <option value="2">Ketchup</option> <option value="3">Relish</option> </select> <br> <br> <select class="multipleSelect" multiple style="width:300px"> <option value="1">Mustard2</option> <option value="2">Ketchup2</option> <option value="3">Relish2</option> </select> <br> <script type="text/javascript"> $('select.multipleSelect').select2(); </script> <br> <br> <span class="STYLE2">select2单选下拉: </span><br> <select id="e1" style="width:300px" class="mySingleSelect"> <option ></option> <optgroup label="第一组"> <option value="1">11111111111111</option> <option value="2">22222222222222</option> </optgroup> <optgroup label="第二组"> <option value="3">33333333333333</option> <option value="4">44444444444444</option> </optgroup> <select> <br><br> <select id="e1" style="width:300px" class="mySingleSelect"> <option ></option> <optgroup label="第三组"> <option value="1">55555555555555</option> <option value="2">66666666666666</option> </optgroup> <optgroup label="第四组"> <option value="3">77777777777777</option> <option value="4">88888888888888</option> </optgroup> <select> <script> $(document).ready(function() { $("select.mySingleSelect").select2({ placeholder: "Select a State", allowClear: true }); }); </script> <br> <br> </body> </html> |
效果如下:
1.一个脚本里的多个action是怎么关系到一起的?Run logic中Block是如何使用的?time:20140226
解答:
1)在Run-time Setting里Run Logic中,先insert block,然后选中这个block,再insert一个action。就可以把多个action关联起来了。
2).设置block的运行规则,就会达到想要的效果了。
time:20140228
2.same line as在哪呢?20140227
解答:参数化中的知识。
参数化,主要是select next row、update value on和when out ofvalues这3个选项会影响到参数的取值。
作为菜鸟的我,就是没有发现same line as在哪。后来又添加了一些参数表后,才发现了这个same line as。
如果只有一个参数表,是没有这个选项的。大于一个参数表后,就会在select next row中发现这个same line as了。
话不多说,上图:
Android官方对
Monkey进行了简单介绍,网上也有不错的翻译。这部分就直接引用官网的原文和网友的翻译。个人理解不同所以觉得有必要把官网原文贴出来。你也可以直接参见https://developer.android.com/tools/help/monkey.html。本文适合android测试人员阅读,欢迎交流讨论。
Monkey是什么
Monkey是可以运行在模拟器里或实际设备中的程序。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力
测试。
The Monkey is a program that runs on your emulator or device and generates pseudo-random streams of user events such as clicks, touches, or gestures, as well as a number of system-level events. You can use the Monkey to stress-test applications that you are developing, in a random yet repeatable manner.
Monkey简介
Monkey是一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行
压力测试。Monkey包括许多选项,它们大致分为四大类:
· 基本配置选项,如设置尝试的事件数量。
· 运行约束选项,如设置只对单独的一个包进行测试。
· 事件类型和频率。
· 调试选项。
在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理:
· 如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
· 如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
· 如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
The Monkey is a command-line tool that that you can run on any emulator instance or on a device. It sends a pseudo-random stream of user events into the system, which acts as a stress
test on the application software you are developing.
The Monkey includes a number of options, but they break down into four primary categories:
Basic configuration options, such as setting the number of events to attempt.
Operational constraints, such as restricting the test to a single package.
Event types and frequencies.
Debugging options.
When the Monkey runs, it generates events and sends them to the system. It also watches the system under test and looks for three conditions, which it treats specially:
If you have constrained the Monkey to run in one or more specific packages, it watches for attempts to navigate to any other packages, and blocks them.
If your application crashes or receives any sort of unhandled exception, the Monkey will stop and report the error.
If your application generates an application not responding error, the Monkey will stop and report the error.
Depending on the verbosity level you have selected, you will also see reports on the progress of the Monkey and the events being generated.
Monkey的基本用法
可以通过开发机器上的命令行或脚本来启动Monkey。由于Monkey运行在模拟器/设备环境中,所以必须用其环境中的
shell来进行启动。可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。基本语法如下:
$ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:
$ adb shell monkey -p your.package.name -v 500 You can launch the Monkey using a command line on your development machine or from a script. Because the Monkey runs in the emulator/device environment, you must launch it from a shell in that environment. You can do this by prefacing adb shell to each command, or by entering the shell and entering Monkey commands directly. The basic syntax is: $ adb shell monkey [options] <event-count> With no options specified, the Monkey will launch in a quiet (non-verbose) mode, and will send events to any (and all) packages installed on your target. Here is a more typical command line, which will launch your application and send 500 pseudo-random events to it: $ adb shell monkey -p your.package.name -v 500 |
命令选项参考
--help
列出简单的用法。
-v
命令行的每一个-v将增加反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息。Level 1提供较为详细的测试信息,如逐个发送到Activity的事件。Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。
事件
-s <seed>
伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列。
--throttle <milliseconds>
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被产成。
--pct-touch <percent>
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。
--pct-motion <percent>
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。
--pct-trackball <percent>
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。
--pct-nav <percent>
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。
--pct-majornav <percent>
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
--pct-syskeys <percent>
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。
--pct-appswitch <percent>
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。
--pct-anyevent <percent>
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
约束限制
-p <allowed-package-name>
如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其它包里的Activity(如选择取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包里的Activity。要指定多个包,需要使用多个 -p选项,每个-p选项只能用于一个包。
-c <main-category>
如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。
调试
--dbg-no-events
设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。
--hprof
设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。
--ignore-crashes
通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
--ignore-timeouts
通常,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
--ignore-security-exceptions
通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成。
--kill-process-after-error
通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。
--monitor-native-crashes
监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error,系统将停止运行。
--wait-dbg
停止执行中的Monkey,直到有调试器和它相连接。 使用Monkey流程
总的来说使用monkey进行测试是比较简单的,只是需要做一些比较复杂的准备工作。下面详解测试步骤(很简单的哦),所讲内容是建立在已经配置好ADB环境的基础上(如果这部分不清楚请先google一下先配置好环境,这里不做描述)。
1、ADB连接Android测试设备。
2、确定你要测试的应用的PackageName。
3、使用Monkey发一条测试命令。
步骤详解
步骤确实很简单吧。不敢保证读者都明白如何去完成上面的步骤,这里讲讲每步如何做。
1、ADB连接Android测试设备。
如果你用的是模拟器,那么启动后通常是已经连在ADB上了。对于真机来说两种方式都可以:
方式一:使用USB把Android设备接到PC上,然后装上驱动(不好找驱动的话就用豌豆荚吧)。
方式二:首先得确保你的Android已经成功root了,那么可以使用wifi无线连接。①下载一个wifi adb应用装在你的android设备上;②在android上打开wifi adb;③在pc上的命令行中输入wifi adb中显示的那部分内容:adb connect 192.168.x.x,命令行中显示connected 192.168.x.x那么说明连接好了。
我比较喜欢方式二,这样可以不用去下载驱动(主要是驱动很多都不稳定),而且不伤害电池。长时间插在USB上对电池始终是不好的。只不过这种方式设备一旦休眠那么就可能需要重连。
2、确定你要测试的应用的PackageName。
先说明一下这里讲的方法是通用的,而网上其他方法获取PackageName不然不通用(因为他是建立在root的基础上的,我不敢保证你的设备已经root)。
①在android设备上点击一下你要测试的设备,然后就不用操作设备了。
②在PC上的命令行输入:adb logcat>D:/log.txt *:I
在这里的D:/log.txt你可以改成其他的路径,但是一定要先确保路径下没有这个文件,不然的话你以前的文件就被改掉了,一定要小心。
③按下Ctrl+c先停掉(为了避免过多的新信息)。打开刚刚的那个文件D:/log.txt。从文件最下面开始找下面格式的信息
I/ActivityManager( 数字): Displayed 包名/类名: +数字ms
例如我的信息如下:
I/ActivityManager( 272): Displayed com.vane/.act.ActLauncher: +315ms
不过你可能会发现有很多这种格式的信息,到底哪个才是你需要的呢,如果你严格按照刚刚的步骤做的话,那么很可能是最下面那条信息,即使不是那么也肯定是最下面几条信息中的某一条,这需要你根据应用进行辨别。
④记下你刚刚得到的包名,例子中的包名为“com.vane”。马上就会用。
3、使用Monkey发一条测试命令。
这一步就比较简单了。直接在pc上的命令行输入:adb shell monkey -p com.vane -v 50
备注:上面命令中的com.vane就是之前获得的包名;命令中的参数你可以自己根据需要参考上面的参数文档进行修改。
4、观察android设备,直到Monkey停止。
5、如果应用崩溃的话就好分析一下Monkey中的信息。
总结
Monkey的使用确实比较简单,但是在测试中确有不小的作用,值得使用。
文字若有不妥之处希望读者提出你的宝贵意见。欢迎拍砖。
1.团队开发时,需要一些项目-任务管理工具来分配和控制项目进度状态.
目前使用是从Jira->redmine->Trac.
1.Jira是收费的,使用上有点罗嗦麻烦,混乱.不想用破解了,毕竟要支持正版。
2.原来使用Redmine的,受不了它的安装过程复杂麻烦,容易出错。运行久了(1年)会有访问不了的异常情况,安装成一个自启动的服务也比较麻烦,升级也比较麻烦,可能对
Ruby不熟悉吧,访问有点慢。
3.现在开始使用Trac作为项目管理工具.还行,基本功能都有。
4.都可以在线试用,可以先睹为快。^-^
以下是对Trac安装的一些提示:
1.运行Trac是需要安装easy_install的,不然会报找不到pkg-resources模块的错误.
2.新建Ticket是需要登录的验证用户的,MileStone的修改是需要付给权限的,偷懒的话直接赋 TRAC_ADMIN权限也行,当然也有其他特定的权限.
3.关键的4个步骤做成了.bat.
01.trac-create-project.bat
@echo off @echo "请输入项目路径:" set /p project-path= trac-admin %project-path% initenv |
02.trac-create-auth.bat
htdigest -c E:\trac-project\conf\users.htdigest trac-project infoworld |
03.trac-server.bat
set trac-project="trac-project,E:/trac-project/conf/users.htdigest,trac-project" set trac-project1="trac-project1,E:/trac-project/conf/users.htdigest,trac-project" tracd -p 8080 --auth=%trac-project% --auth=%trac-project1% E:/trac-project E:/trac-project1 |
04.trac-add-permission.bat
trac-admin E:/trac-project permission add infoworld TRAC_ADMIN
其他:
修改trac的wiki上传附件大小
trac默认的附件大小太小了,需要增加一下大小。修改配置文件 trac.ini
[attachment]
max_size = 262144
将max_size 设置为自己期望的大小。
1.procedure,function,trigger的区别,从功能,返回值,参数,与
sql关系等说说
2.你经常如何tuning PLSQL代码呢?从什么角度tuning?PLSQL优化技术你知道的有哪些,可以举例?
3.对于PLSQL的一些硬编码,你有哪些方法来避免,请举一些有代表性的例子并说明好处。
4.对in,out,in out mode参数的赋值过程是如何的?以及他们的主要区别?
5.在PLSQL里你如何避免重复代码问题的,请举例说明
6.你的PLSQL代码里有COMMIT吗?你如何看待频繁COMMIT问题的。
7.请列举4种动态语句,并说明用途。
8.SQL性能调整你经常用哪些工具,比如explain plan,set autotrace,10046等,他们之间有什么区别。
9.描述DBMS_PROFILER包、DBMS_HPROF、DBMS_TRACE、DBMS_UTILITY的常见用途。
10.描述array,nested table,index by table的区别。
11.forall和bulk collect干嘛的?基本原理是什么?请举例在什么情况下你会用批处理,有什么注意点,limit一般设为多大,为什么?
12.你认为package编程与非package编程相比,有什么好处?
13.在PLSQL里如何使用绑定变量,为什么要使用绑定变量?请举例说明。
14.sql中可以调用自定义的function,有什么限制?
15.autonomous transaction是干嘛的?请描述一下,并且举例说明其用途。
16.在PLSQL里,你用什么的方法保护你的代码安全。
17.请描述下cursor的几种迭代方式:loop...end loop,while ... loop,for ...loop以及区别。
18.PLSQL的异常控制,你经常如何做?DBMS_UTILITY.FORMAT_ERROR_STACK、DBMS_UTILITY.FORMAT_CALL_STACK以及DBMS_UTILITY.FORMAT_ERROR_BACKTRACE是干嘛的?请描述下你对PLSQL的error handle的理解以及常用处理方式?
19.管道table函数常用于什么场合,你对piple function如何看的,经常使用的场合在什么地方?
20.和PLSQL编程相关的系统视图你知道哪些,简单描述下其功能。
内存分析方法:
内存分析用于判断系统有无遇到内存瓶颈,是否需要通过增加内存等手段提高系统性能表现。内存分析需要使用计数器:Memory & Physical Disk类别的计数器,以下是内存分析的主要方法和步骤
1>.查看Memory\Available Mbytes指标,该计数器是描述系统可用内存的直接指标,在对系统进行
操作系统级别的内存分析时,首先通过该指标建立一个初步的印象,了解
性能测试过程中系统是否仍然有足够的内存可用,如果该指标的数据比较小,系统可能出现了内存方面的问题,这时需要继续依据以下步骤进行进一步的分析
2>.注意Pages/sec、Pages Read/sec 和 Page Faults/sec的值。操作系统经常会利用磁盘交换的方式提高系统可用的内存量或内存的使用效率。
Windows和Unix操作系统都提供了类似的方法来支持磁盘交换计数,而这三个指标直接反应了操作系统进行磁盘交换的频度
Pages/sec的计数持续高于几百?很可能会有内存方面的问题产生,但Pages/sec的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致
Page Faults/sec值表示每秒发生页面失效的次数,页面失效次数越多,说明操作系统向内存中读取的次数越多,此时还需要查看Pages Read/sec的计数值,该阀值为5,如果超过5,则可判断存在内存方面的问题。
3>.根据Physical Disk计数器的值分析性能瓶颈,对Physical Disk计数器的分析包括对Page Reads/sec 和%DiskTime 及Average Disk Queue Length的分析。如果Pages Read/sec很低,同时%Disk Time 和Average Disk Queue Length的值很高,则可能有磁盘瓶颈。但是,如果队列长度增加的同时Pages Read/sec并未降低,则是由于内存不足。
处理器分析方法
1>.查看System\%Total Processor Time性能计数器的计数值。该计数值用于体现服务器整体的处理器利用率,对多处理器系统而言,该计数值体现的是所有CPU的平均利用率。如果该值的数值持续超过90%,则可以说明整个系统面临处理器方面的瓶颈,需要通过增加处理器来提高性能
2>.查看每个CPU的Processer\%Processor Time和Processor\%User Time 和 Processor\%Privileged Time
Processor\%User Time 是指系统的非核心操作消耗的CPU的时间,如果该值较大,可以考虑是否能通过算法优化等方法降低该值。如果服务器是
数据库,Processor\%User Time 值大的原因很可能是数据库的排序或是函数操作消耗了过多的CPU时间,此时可以考虑对数据库系统进行优化。
3>.研究系统处理器瓶颈,查看System\Processor Queue Length计数器的值,当该计数器的值大于CPU数量的总数1时,说明产生了处理器阻塞。在处理器的%Process Time值很高时一般都伴随着处理器阻塞,但产生处理器阻塞时,Processor\%Process Time计数器的值并不一定很大,此时就是必须查看处理阻塞的原因。
%DPC Time是另一个需要关注的内容,该计数值越低越好。在多处理器系统中,如果该值大于50%并且Processor\%Processor Time值非常高,则考虑加入一个网卡来提高性能。
磁盘I/O分析方法
1>.计算每磁盘的I/O数。每磁盘的I/O数可用来与磁盘的I/O能力进行对比,如果经过计算得到的每磁盘I/O数超过了磁盘标称的I/O能力,则说明确实存在磁盘的性能瓶颈。
2>.与Processor\Privileged Time合并进行分析。如果在Physical Disk计数器中,只有%Disk Time值较大,其他值都比较适中,则硬盘可能会是瓶颈。若几个值都比较大,且数值持续超过80%,则可能是内存泄露。
3>.根据Disk sec/Transfer进行分析。一般来说,定义Transfer数值小于15毫秒为优秀,介于15~30毫秒之间为良好,30~60毫秒之间为可接受,超过60毫秒则需要考虑更换硬盘货硬盘的RAID方式
进程分析方法
1>.查看进程的%Processor Time值,每个进程%Processor Time值反映出进程所消耗的处理时间。将不同进程所消耗的处理器时间进行对比,可以容易地看出具体哪个进程在性能测试过程中消耗了最多的处理器时间,从而可以据此针对应用进行优化
2>.查看每个进程产生的页面失效
3>.了解进程的Process\Private Bytes
网络分析方法
Network Interface\Bytes Total/sec为发送和接收字节的速率,可以通过该计数器的值判断网络连接速度是否是瓶颈,具体操作方式是用该计数器的值和目前网络的带宽进行比较。