玩计算机的老炮儿都知道买回来一台新机器,都需要烤机,也就对主机性能进行测试,一般三天,不死机,没有故障就是可以了。现在每天都上线N个网站,有几个对自己的网站进行过性能测试,压力测试,安全检测呢?网站线之后发现很多问题安全问题,被黑客威助等诸多问题,都源于没有提前规则,没有做好网站上线的全面测试,才会有后面很多问题,最后网站办不下去,公司倒闭!还没想明白原因所在。比如,P2P网贷平台。
Web 服务处于分布式计算的核心位置,它们之间的交互通常很难测试。分布式开发、大型的开发者团队以及对代码日益组件化的期望都有可能使 Web 服务的开发变得越来越容易隐藏错误。这些类型的错误极难检测出来。压力测试是检测这类代码错误的一种有效方法,但是只有在压力系统设计得比较有效的情况下才能发挥作用。本文将让您了解一下压力测试的重要性及简单测试方法。
理论部分:
测试方法
传统的测试方法包括某种形式的简单单元测试,通常由开发人员执行。设计这些测试需要了解软件的内部知识,并且这些测试几乎总是针对产品的非常小的、特定的部分。这些类型的测试非常适合与其他代码组件极少交互,甚至没有交互的简单 Web 服务。
功能验证(Functional Verification) 也是一种测试过程,在这个过程中,对产品源代码了解有限的设计者进行测试以确认产品或服务的核心功能。设计这种测试是为了证明这个核心功能符合某个规范。举个例子,我的在线拍卖显示的是输入的正确出价吗? 我的保险经纪人系统找到最便宜的报价了吗?如果这些测试失败,通常就意味着检测到了产品的一个基本问题(这个问题通常是可以直接修复)。这种测试也是适合简单的 Web 服务,使您可以检查服务是否能够正确执行它的各个功能。
系统测试(System Test) 通常是在功能验证阶段完成,验证了核心功能后进行。它倾向于把整个系统作为一个整体来查找问题 — 弄清 Web 服务作为系统的一部分怎样运作,以及 Web 服务相互之间如何交互。由于系统测试是在开发生命周期快结束时才进行,所以通常不能给它分配足够的时间来完成。又因为紧张的发行日程安排以及开发的各个重要阶段的后移,系统测试阶段经常被忽略,并且一些通常都可以发现的、少见的错误都不能被检测到。即使发现了这种错误,这时也来不及确定错误的原因并设法修复它们了。因此,在查找代码错误时,必需把系统测试应用设计得尽可能高效。系统测试通常由三部分组成,它们是:
性能(Performance): 这涉及到确定相关的产品统计数据的过程。例如:每秒有多少条消息?一个服务可同时接受多少个用户?
案例(Scenario): 这是重新创建客户所需的确切配置的过程。因此在案例中发现的任何问题都可以在客户使用该产品之前被检测出来。
压力(或称工作负载平衡): 它与另两个部分不同,因为它被设计为通过应用很大的工作负载来使软件超负荷运转。如果压力测试通过对产品保持高强度的使用(但不超过性能统计数字确定的限制)能有效地执行,那么它就经常能够发现许多隐蔽的错误,而这些错误用上面提到的任何其他技术都是发现不了的(这些错误也经常是最难修复的)。
从检测代码错误这方面来说,可以证明这三个系统测试组件中效率最高的是压力测试部分。但由于这个过程经常跟系统的其他要素或功能测试混淆在一起,所以这个过程涉及到的方法还没有被正确着手处理或实现。
压力下的错误
使用压力测试,您有希望找到很多种用其他测试方法更难发现的错误。有两种错误类型是:
内存泄漏(Memory leak): 一种极难检测的现象。内存泄漏经常发生在已发行的产品中,原因很简单,很难设计测试用例来检测它们。使用简单的功能测试,几乎发现不了内存泄漏问题,因为在产品完成之前测试没对产品进行足够多的使用。内存泄漏通常要求操作作要重复非常多的次数以使内存消耗达到能引起注意的程度。尽管与其它编程语言(如 C/C++)相比,Java 程序更难引入内存泄漏错误,但只要程序仍保持着对对象的引用,该对象仍有可能被实例化并且它占用的内存永远不会被释放。
并发与同步(Concurrency and Synchronization): 压力测试在查找并发性问题上非常出众,这是因为在任何一个测试生命周期中,它都应用了许多不同的代码路径和定时条件。一般的规则是,压力测试运行的时间越长,涉及并应用的代码路径组合和定时条件就越多。当然,这也的确使得这些问题很难再现(错误可以在 5 分钟或 5 天后发生)。死锁、线程泄漏以及任何一般的同步问题通常只能在压力测试阶段被检测出来。这些类型的问题很难通过执行单元测试来发现。开发人员不会一直考虑他或她的代码将与其他地方的代码(在执行单元测试时这些代码可能还没写出来)进行交互。
现有的压力测试工具
有许多声称能够对产品进行压力测试的可用工具目前正在开发中。被广泛应用的是针对 Web 服务的那些工具。然而,这些工具中有许多只是简单的 HTML/SOAP 生成器,它们模拟许多客户机连接,并因此对 Web 服务器生成高负载(这对于查找 Web 服务器的问题很有用,但对于查找 Web 服务的问题就没那么有用了)。这些工具对基本的压力测试比较有用,但它们经常是仅仅扩展功能验证阶段来重复地执行相同的功能任务。如果足够的时间和资源可用,就可以通过创建定制构建的压力测试系统来实现更有效的测试。由于压力系统的设计者通常对要测试的产品和 Web 服务有更多的了解,所以他们将能够确保压力系统可以用于哪些具体的代码区域。
设计压力应用
设计试图对 Web 服务进行压力测试的压力测试系统时,要让它们以某种特定的方式运行代码。这些风格超越了功能验证,目的是要弄清楚被测试的 Web 服务是不是不仅能做我们认为它能做的事,而且在被施加了某些高强度压力的情况下仍然继续正常运行。压力测试必须对 Web 服务应用四个基本条件。许多已建立的压力系统应用了这些条件。有效的压力测试系统将应用以下这些关键条件:
重复(Repetition): 或许最明显的且最容易理解的压力条件就是测试的重复。换句话说,测试的重复就是一遍又一遍地执行某个操作作或功能,比如重复调用一个 Web 服务。功能验证测试可以用来被弄清楚一个操作作能否正常执行。而压力测试将确定一个操作作能否正常执行,并且能否继续在每次执行时都正常。这对于推断一个产品是否适用于某种生产情况至关重要。客户通常会重复使用产品,因此压力测试应该在客户之前发现代码错误。许多最简单的压力系统只实现这一个条件,但简单地扩展功能验证测试来多次重复并不能构成一个有效的压力测试。当与下面的一些原则结合起来使用时,重复就可以发现许多隐蔽的代码错误。
并发(Concurrency): 并发是同时执行多个操作作的行为。换句话说,就是在同一时间执行多个测试,例如在同一个服务器上同时调用许多 Web 服务。这个原则不一定适用于所有的产品(比如无状态服务),但是多数软件都具有某个并发行为或多线程行为元素,这一点只能通过执行多个代码示例才能测出来。功能测试或单元测试几乎不会与任何并发设计结合。压力系统必须超越功能测试,要同时遍历多条代码路径。至于怎么做到这一点取决于具体的产品。例如,一个 Web 服务压力测试需要一次模拟多个客户机。Web 服务(或者任何多线程代码)通常会访问多个线程实例间的一些共享数据。因额外方面的编程而增加的复杂性通常意味着代码会具有许多因并发引起的错误。由于引入并发性意味着一个线程中的代码有可能被其他线程中的代码中断,所以错误只在一个指令集以特定的顺序(例如以特定的定时条件)执行时才会被发现。把这个原则与重复原则结合在一起,您可以应用许多代码路径和定时条件。
量级(Magnitude): 压力系统应该应用于产品的另一个条件考虑到了每个操作作中的负载量。压力测试可以重复执行一个操作作,但是操作作自身也要尽量给产品增加负担。例如,一个 Web 服务允许客户机输入一条消息,您可以通过模拟输入超长消息的客户机来使这个单独的操作作进行高强度的使用。换句话说就是,您增加了这个操作作的量级。这个量级总是特定于应用的,但是可以通过查找产品的可被用户计量和修改的值来确定它。例如,数据的大小、延迟的长度、资金数量的转移、输入速度以及输入的变化等等。单独的高强度操作作自身可能发现不了代码错误(或者仅能发现功能上的缺陷),但与其他压力原则结合在一起时,您将可以增加发现问题的机会。
随机变化: 最后一点,任何压力系统都多多少少具有一些随机性。如果您随机使用前面的压力原则中介绍的无数变化形式,您就能够在每次测试运行时应用许多不同的代码路径。下面是几个关于怎样在测试生命周期内改变测试的示例。使用重复时,在重新启动或重新连接服务之前,您可以改变重复操作作间的时间间隔、重复的次数,或者也可以改变被重复的 Web 服务的顺序。使用并发,您可以改变一起执行的 Web 服务、同一时间运行的 Web 服务数目,或者也可以改变关于是运行许多不同的服务还是运行许多同样的实例的决定。量级或许是最容易更改的 — 每次重复测试时都可以更改应用程序中出现的变量(例如,发送各种大小的消息或数字输入值)。如果测试完全随机的话,因为很难一致地重现压力下的错误,所以一些系统使用基于一个固定随机种子的随机变化。这样,用同一个种子,重现错误的机会就会更大。
一个压力测试通常会结合上述的所有原则,并且在允许的范围内尽可能长时间地运行。测试被允许的执行时间越长,就可以遍历越多的代码路径,并且发现的错误也越多。当然,一旦找到错误就必须诊断并修复它。由于一个代码错误可以在压力测试运行多日以后自己显示出来,所以系统必须保证当出现错误时所有可用的调试信息都被生成,否则可能就必须花费同样多的时间来重现这个错误。
实践部分:
我们要对自己网站进行压力测试,看要达到一个什么要求,
先定一个目标,接着对达到此目标进行设计方案,
案例一,
p2p网贷平台,
测试要求:
一,同时在线1万人不卡
二,能对黑客Cc攻击进行有效防护。
之前我们上篇已经介绍如何找代理服务器及如何架设代理服务器,我们介绍一个软件,这个软件在行业内赫赫有名,是Cc攻击鼻祖。
原理就是通过代理,模拟访问,如果你代理足够多,理论上是可以刷新任何网站,github官网 不是被刷死了吗?
我先测试第一个项目
1万人同时在线,你有50个代理,每代理发起200个连接就可以达到目标,
开始测试,
先导入代理,ip,
目标地址,就写要测试的网址,
攻击列表,就是你要测试的页面,你可以是多个,
攻击线程,默认是10个,一般200~1000个都可以。
目标显示结果,可以用cc终结者,直观看到,也可以通过web log进行分析。
现在我是在被攻击的服务器上查看的
一秒大概是,1500个tcp连接,活动刷新。
一般这样测试24~48小时,没有故障,同时查看cpu,内存占有率,如果都正常,也不卡顿,第一阶段已经完成,
要求第二
能对黑客Cc攻击进行有效防护,
黑客攻击一般不会简单的刷新首页,而是会找你最薄弱的环节进行攻击,换句话说黑客会找到网站最占资源的页面进行分析。
这是需要一定的分析能力的,一个网站一般什么地方最占资源呢?
需要分析网站使用的脚本语言,asp,asp.net,php,jsp 常用的脚本语言,找到带参数的地方,进行测试。
例 hmw.asp?id=xxx
一般带参数都是要查询数据库,select * from Artilce where id="id"
而且如何使用cdn加速,也需要回源查询.
一般的参数都不是最占资源的,黑客如果想刷新的源服务器,一般都是找搜索的地方,
Get
http://bbs.77169.com/searcher.php?kay=“搜索内容”
如果是Get搜索,是黑客Cc攻击的重要页面
Post
http://bbs.77169.com/searcher.php
有些搜索是post提交,黑客也会选择。
原理很简单
Artilce表,有1亿条数据,
一条查询语句,如果查询成功还好,如果查询失败黑客给了一个不存在的值,他需要查询完1亿条数据,查完全部数据库,
只需要提交100条,一般服务器就直接数据库卡死了。
select * from Artilce where content like '%key%'
下面黑客一般会怎么构造刷新的语句
程序可以自动生成随机字符,+表示随机字符标志+{N|U|L|C}+x N表示数字,U表示大写字母,L表示小写字母,C表示一个汉字,x是长度,规定为1-9。例子A+N1+U2+L3+C1BCD将可能生成A3BBcde%BA%CEBCD这样一个随机串攻击列表里面的添加规则{G|P}http://target.com:port/page.asp?id=+N3&name=+C3G表示Get模式 P表示POST模式,软件能够自己分辨出参数和HOST选项等等。
比如Phttp://www.77169.com/abc.php?id=3 软件将用POST模式提交id=3到www.77169.com上面去
攻击列表里面可以同时添加几个不同的服务器的URL,软件能够自动分别对待。
实例操作是这样的
分析有搜索页面
http://www.test.com/searcher.php?kay=+N3&name=+C3G
注意要选择随机攻击,随机字符。
我们在被压力测试的目标主机抓包
下面是日志分析生成的html页面,
GET /searcher.php?kay=155&name=%C8%B1%F0%E2%E7%A0G
GET /searcher.php?kay=155&name=%C8%B1%F0%E2%E7%A0G
你看到多表,都是kay=3位随机数字&name=随机字符
结果是没十分钟数据库就直接卡死了,华安普特公司防护ddos,cc攻击十余年有丰富经验,如有此类攻击可以咨询我们将免费提供技术支持。www.77169.com.cn
结束语
篇幅所限,此篇文章只是简单介绍了一些皮毛,现在Cc攻击一直在发展,此工具用于本公司内部测试问题不大,如用于攻击他人应当用处不大,现在基本者集群工具,单机Cc的已经很少了。如果你没有怎么代理服务器,你也可以我们帮你测试,免费压力测试5名。
下面给大家提供一下网站压力测试工具。
==============================
网站压力测试工具集
工具 相关网址
LoadRunner http://www.mercuryinteractive.com/products/loadrunner/
SilkPerformer http://www.segue.com/products/load-s ... nce-testing/index.asp
QALoad http://www.compuware.com/products/qacenter/qaload.htm
WebLoad
OpenSTA 开源
Jmeter 开源
自动测试工具集
工具 相关网址
WinRunner http://www.mercuryinteractive.com/products/winrunner/
SilkTest http://www.segue.com/products/functio ... l-testing/silktest.asp
QARun http://www.compuware.com/products/qacenter/qarun.htm
SAFS http://safsdev.sourceforge.net/Default.htm
Bug追踪系统
工具 相关网址
JIRA http://www.atlassian.com/software/jira/
Bugzilla http://www.bugzilla.org
TestDirector http://www.mercuryinteractive.com/products/testdirector/
GNATS http://www.gnu.org/software/gnats/
TestTrackPro http://www.seapine.com/ttpro.html
软件测试网站
http://www.51cmm.com
http://www.sqe.com
http://www.qadirect.com
http://www.bonoy.com
http://www.sztest.net
http://www.testage.net
http://www.sqatester.com
http://www.testingfaqs.org
Webserver Stress Tool Enterprise v7.0.2.173 特别版
简介说明:
可以模拟任何人数在同一时间內进站或是顺序进站时你的 Server 的反映表现,只要输入网站的 URL 网址以及模拟的上站人数,就可以看出 Server 在这种压力测试下的评比,它以调解图明白地 表示出 Server 反映时间、传输速率等相关数据,除了 Http 的网页外,CGI 或 ASP 等语言编写的程式一样逃不过 WebStress 的测试,支持 Proxy 设定、密码输入、Cookies 与 ASP、
Session-IDs 等功能
特别说明:
Name: Matthias Kozel
Key : 000017-ZNG4YN-ZYEP6H-AYUF6V-WXNDYA-EJ1R4W-RH7R9F-D9GEBA-36M4VC-YYDXMH