声明:本空间的内容不全部是原创,如有雷同只为学习与借鉴之方便,别无它意,来者是朋友,愿通过此平台结交天下测试达狼!

【转】自动化框架搭建

上一篇 / 下一篇  2012-10-12 11:32:05 / 个人分类:其它

'\ ]dGCz~0说起自动化测试,我想大家都会有个疑问,要不要做自动化测试? 自动化测试给我们带来的收益是否会超出在建设时所投入的成本,这个嘛别说是我,即便是高手也很难回答,自动化测试的初衷是美好的,而测试工程师往往在实现过程中花费了很多成本、精力,而最终以失败告终。 失败的原因会很多,我总结几项:

:i#VG!L#x_!n051Testing软件测试网 F;Ztl3I*_Sm&oB

1.    太过依赖测试工具,高估了工具的力量,最终会以失望告终。51Testing软件测试网(?+AN6@;?J*p t{

51Testing软件测试网 M&C/z.{~}$p

2.     项目紧急的情况,为了规避那些多余的环节,干脆人工测试,结果整个链路中断。

0v? z9z;He L&v051Testing软件测试网/G'F$gq6Sjg ga

3.     研发和测试人员不能很好的交互,如果这两个角色之间有了一道防火墙,那别说自动化测试了,手工测试也不会有好的效果。测试人员可以把研发想象成自己的女朋友, 努力培养相互之间的感情。51Testing软件测试网z;L'\i'}(H"s#J

FFOv:v,Z04.     自动化测试人员实力被低估而导致的情绪低落,这个问题在所有岗位上都会发生,当然要看领导重视程度了。

ZUlk3JXG/c051Testing软件测试网"o/U a?rYH F

5.     资源不够,公司不舍得资源投入,或者蹑手蹑脚,那就不要浪费时间了。

Ig Sl!?V+g051Testing软件测试网\@Q&D*b I!u!vQ

6.     太高的期望,过低的回报。

,@d)gw,wx*l0

S&W-_ }2J&qL F%|0现在国内没有几家公司说能玩转自动化测试的,在看国外那些耳熟能详的企业像google ,Microsoft ,它们反而搞得热火朝天的。可笑的是在微软中国的测试部门工作过几年的测试经理,出来搞个什么《微软自动化测试体系最佳实践课程》,就能忽悠国内的那些知名的企业掏钱去听,我这也不是说他们的东西不好, 只是希望我们自己也能够重视起来,要知道人家“卓越”体系也是由那些“专业团队”花了很多的时间和精力才搭建起来的,所以先不说收益如何,即便是为了这一个美好的初衷,我们也应该去尝试一下,即使是失败。51Testing软件测试网8j B+v"p;t2Z8r

51Testing软件测试网&Z#LQQ ?J

我也做了几年的测试,但也是最近才开始研究自动化测试的,在工作中多多少少接触过几种常见的工具,如 silktest 和Selenium,搞过测试的应该都听过,我最近刚刚为现有项目搭建了一个测试框架,为其中的部分模块编写了一些测试case, 收益还是颇丰的,先说说这两种工具吧。51Testing软件测试网x;E:X Y ~Q SR

%}!c7b s~j{ V3W;v0SilkTest 是商业工具,想使用是需要花钱的,但是有现成的平台和框架,也比较容易学习,可以基于windows ,unix平台。ie ,firefox (部分)浏览器。可以录制回放,对象识别或者手工编程,也能基于数据驱动,关键字驱动等等测试框架。SilkTest 里面的语言4test 其实是类C (也有Silk4J ,用Java写),编程能力相对较强。

*J4WEx o? Q051Testing软件测试网&KQ e*za;tQ%X

Selenium 是免费的,需要有类似ide (如eclipse ),原先是thoughtworks 的几个牛人开发的,现在google 维护(人都跳槽过去了)。可以基于windows ,unix ,mac 等平台。ie ,firefox 等浏览器。 测试团队,经费不足,能力很强(Java 上面),有对测试平台和环境要求比较高(ie ,firefox ,safari 等等),那么Selenium 是很不错的选择。51Testing软件测试网{uv kAjX:R]\+U\

51Testing软件测试网Uk/{'^1Ek^ V

       今天我就简单入个门,先介绍通过junit+selenium+Coverlipse+ant 来搭建一整套自动化测试框架,开始之前我先提出几个问题,请大家根据下面的问题来阅读本篇文章
${u? B%fdl3{01. 如何录制脚本?51Testing软件测试网Du}(e1KHm#R S

51Testing软件测试网M#u/[5a:uKk9F

2. 如何转换成junit 脚本?51Testing软件测试网%j],b6\*Y"[

51Testing软件测试网m2J:w0@}@

3. 如何生成junit日志?51Testing软件测试网Pm"a7be#G6\

51Testing软件测试网eL0Uw5n"n2b#O

4. 如何回放selenium 及查看回放日志?51Testing软件测试网o%RIwit

51Testing软件测试网G:e;|5h{m

5. 如何查看代码的覆盖率?51Testing软件测试网 D+NjI u+[ P u

0@Y C7p-[8G,`q0一、工具准备51Testing软件测试网#b_1|.j.l+|+a-\

51Testing软件测试网s;vq'z0g


qpL,u3mrWl0工具
2e1X ZZ CX J+xs \0 说明51Testing软件测试网 fE bXT*rpa*V
 下载51Testing软件测试网p&_Va O%C
 
@e,d[G:N7l2A j0junit
\%g6gf[ b.U!{0 JUnit 是一个开发源代码的Java 测试框架,用于编写和运行可重复的测试。
~q YZJ(j{0 http://www.junit.org

sq {&U|[*~ Q0

5@? n#{BFB.oC0
-p,x as/HO'H0 51Testing软件测试网_ RDR^c
selenium
%\bMw J?7q6]1S0 先介绍两个重要的组件Selenium-IDE 来录制脚本;selenium-rc selenium-remote control 缩写,是使用具体的语言来编写测试类
T.b"aR Cu6t5@ o0 http://seleniumhq.org/download/51Testing软件测试网 \OFmQ!Z@ P

51Testing软件测试网 Y_p3bFYNp

51Testing软件测试网k#P@ oc,NO'hw
 
w j$}6D{0Coverlipse51Testing软件测试网&i*w#N2GT ep8~!~
 Coverlipse 这个Eclipse 插件能够把JUnit 测试的代码覆盖直观化。51Testing软件测试网1vLq(h8e2?
 http://coverlipse.sourceforge.net/download.php51Testing软件测试网^$|#E:BX.m B!]

51Testing软件测试网S7xo.d*vV-Dl


G Fc7_ [0 51Testing软件测试网'\ twEg a'C dUK:F
Ant51Testing软件测试网E jtr|?K8^
 Ant 是一个类似make 的工具, 大家都已经很熟悉了,这里我们可以利用其中的ant task 来生成junit 日志
~%G YeQu0 http://ant.apache.org/bindownload.cgi

hL?D'R/H2g0

"f_$}r7^[0
~5as6@] b'I8H A"g.Z0 51Testing软件测试网q2i YDv8`

8fV k C({m0
yu9ff-z8@0二、Junit 的安装

"?2|6G8Jdf0

4o1H6u8_2] OU&xm01.         Eclipse 本身会自带Junit.jar 包,所一般情况下是不需要额外下载junit 的。51Testing软件测试网%i([y \U/_$O

51Testing软件测试网#Wf%?P!d H

2.         将junit3 的library 添加到工程的buildPath 中

L&f @]`&d;?g+l5Zd*A051Testing软件测试网N/b,g"~_

3.         因为junit 的日志是通过Ant 来生成的,所以一定要将Junit.jar 添加到ant_home 里51Testing软件测试网^.Sv^3Y }(tt

s:q+[}*M9OR*\g0三、selenium 的安装51Testing软件测试网:|[K fd)p'm?

E'w ` m*jVCx f1[!}J01.         安装seleniumIDE ,打开火狐浏览器,然后进入工具—> 添加附件,搜索seleniumIDE

)T N6s@0Yo:Q({'}0

WeI8tX KZ02.         查询出对应的IDE 后,点击直接安装,安装结束后重启FireFox ,看到下面的菜单说明安装成功

R8]q n {_0

iG"CkuW;Z03.         安装selenium-rc ,先去http://www.openqa.org/selenium/下载selenium 包。用命令行来到解压到文件夹下:d:\autoTesting\ selenium-server-standalone-2.0b1.jar 目录下

!W.z E;VA051Testing软件测试网[A2o%v~+Ib2W

4.         运行java -jar selenium-server-standalone-2.0b1.jar ,启动seleniumserver。为了在运行时应用运行的浏览器与selenium 服务的浏览器分开可在其后面加–multiWindow 。51Testing软件测试网TS*k_2Ijd$ue

51Testing软件测试网1u G~J] y'O

5.         在Eclipse 创建一个项目,在项目的build path 里面加上elenium-server-1.0-beta-1 下selenium-server.jar 、selenium-java-client-driver-1.0-beta-1 下selenium-java-client-driver.jar (这两个在刚解压的包里面)和eclipse\plugins\org.junit_3.8.1 下junit.jar 。

eret2M Kq Oy0

/X u f3P Zd+M\;P051Testing软件测试网kT3^L|\
6.         将制定的Jar 包导入到工程里,然后你就可以集成并使用相应的API ,编写自己的测试CASE 了。

'm$q!q C*DwbpU0

h#I+N/G$G@:_4vMA:?0四、Coverlipse 的安装51Testing软件测试网:C#^:d2E2IGOd9u6Q

51Testing软件测试网E-s%KQVx?

1.         直接通过Eclipse 即可安装,步骤如下51Testing软件测试网!S6NU1XS&J

51Testing软件测试网W.t,?0ohx*{e4xp;}(q

•In Eclipse, click Help -> Software Updates -> Find and Install.
9oL,K z.C i(A:d rw^X0•In the dialog, select Search for new features to install, then Next.51Testing软件测试网s.i:vS}h%PD(UT
•In the next step, add a New Remote Site. Name it "Coverlipse update site", the URL is "http://coverlipse.sf.net/update/".51Testing软件测试网^ BYD Fq
•Press Finish. Eclipse now searches for the Coverlipse feature to install and shows that to you. 2.         配置 Coverlipse 以获取代码覆盖51Testing软件测试网}:MD+Ah6tv I/N
 

'xk P*i7Q CZK4K%Y051Testing软件测试网#pc3M Q+b6BJ ?

3.         一旦单击了 Run ,Eclipse 会运行 Coverlipse 并在源代码(如图 7 所示)中嵌入标记,该标记显示了具有相关 JUnit 测试的代码部分
.M&Ws d$?M2]04.     Coverlipse 生成的具有嵌入类标记的报告

2BaTBy sZ0

6{2wNZU{0
4pq bT;KI)C+}8aA05.      正如您所见,使用 Coverlipse Eclipse 插件可以更快地确定代码覆盖率。例如,这种实时数据功能有助于在将代码签入 CM 系统前 更好地进行测试。51Testing软件测试网M5~Z+m2Gg

51Testing软件测试网0O;oKd U5S6{ J

五、ANT 安装,eclipse 自带,只需要配置环境变量ant_home 即可。

,^@pfuy'^!p/h0

f G8G2gF4f:F`*q0
hT K$HX9JF0六、创建一个案例

ND5l(`7m,_@051Testing软件测试网(f dT5b i;m/Js

1.         创建一个工程testSelenium 安装下面目录结构51Testing软件测试网3h [|ev{

51Testing软件测试网lD'UP)i nx)`V

2.         录制脚本,打开Firefox 浏览器,进入selenium IDE 菜单

%|d/K jm051Testing软件测试网{ A%s9uH'Zu

3.         输入相应录制的地址,点击红色按钮,开始录制51Testing软件测试网s2j7O V(np"w0F

u.S|hYd$M8C04.         将脚本转换成junit 代码,然后将其拷贝到测试类中做为测试CASE 编码的雏形。51Testing软件测试网 p*w I2^M-T.s

51Testing软件测试网c4[,x$GIjA8M\

六、如何查看日志,这里日志分两类:

pX*ye/g(l T"T[(o051Testing软件测试网 n9]OL4c)T

l          Junit 日志,通过junit 写的断言,和标准输出,这些操作产生的日志记录。

i;a&|ng FK*i;X Z0

3J kNC l0l          Selenium 日志,当运行junit 脚本时,selenium 相关的脚本就会产生回放日志,例如打开界面的url ,标准输入,输出等信息。

-R*Y)v U X U/T(e k F0

"p s%h j/{/J1l!M0    虽然这两种日志没有交集,需要分开查看。但一般情况下我们只需要观察Selenium 日志已经足够用了,与其相比Junit 日志更适用于编码阶段。

FtMy!Ye3Cp^051Testing软件测试网'TVr D_%H{

1.       Junit 日志, 只需要配置脚本build-selenium.xml ,如下

rjb)M;h"b Z4ks051Testing软件测试网?(BdWI^

<project name="seleniumTest" default="junit" basedir=".">

0yUJ,`*r?!b&l9p051Testing软件测试网LYBM5Y2G4afq

       <property environment="env" />51Testing软件测试网r*TL I7G5i Jlo|&j

51Testing软件测试网2i xz]-|wI

       <condition property="ia.home" value="${env.IA_HOME}">51Testing软件测试网K2a#U/nz$Y;y

51Testing软件测试网YCKEv

              <isset property="env.IA_HOME" />51Testing软件测试网{ ?.m(D3ii

51Testing软件测试网H9].~3U _!K6G

       </condition>

#l)xs}}(o$G'r0

6P*n Q,g rX d1s0       <property name="run.classpath" value="../class">

:]mP;t w\^051Testing软件测试网vARz aad]vB

       </property>

Kd }"T\ijQ1b051Testing软件测试网 E3? ?[#v _d+E%[

       <property name="run.srcpath" value="../testSelenium">

@ fU&O8J:h O1U$d;k0

Y^9Q?8I-_ J0o0       </property>51Testing软件测试网;g9sB5s l)|5j

51Testing软件测试网%}2eJ8o}2Q|/w

       <property name="test.xml" value="../xml">51Testing软件测试网o5IXo%U k2hK

2YXmOZ2z.O0       </property>51Testing软件测试网;g%g^2Ct^:F

51Testing软件测试网 Fz1q5U/K?

       <property name="test.report" value="../report">

Ho])f^-W ~0

1|0Nm%]%WyKI(v0       </property>51Testing软件测试网 ?:P"a(R6f)`W,hX3B

51Testing软件测试网4R1_g1W3~1y4f$n5U

       <property name="lib.dir" value="../lib" />

AB)X7UT@Z051Testing软件测试网3[8KuDT,\Db]

       <path id="compile.path">

4x5y,B!`0X+n(f a/G;E051Testing软件测试网b:J8cp!H.F

              <fileset dir="${lib.dir}">51Testing软件测试网e.s;Mz6Y^v

51Testing软件测试网4Q m;^.\6O$f

                     <include name="junit.jar" />

b W&O)E*zi*Q051Testing软件测试网 `bu;O6n G'cc3g9r

                     <include name="ant.jar" />51Testing软件测试网VpQDP.F

51Testing软件测试网c4{8b4U,E{

              </fileset>51Testing软件测试网g fcH sm

"n/w)uL a7u:n"E0       </path>

)S,Q$SA1w4Q0

+@rAk:B"v0       <target name="init">51Testing软件测试网 O W-A4cGmP(P1A

W/q ur U,Zs w$y&Nw0              <delete dir="${run.classpath}" />51Testing软件测试网v ]MB(OY}!` N BZ y

51Testing软件测试网W,DW0R M|:C1C

              <mkdir dir="${run.classpath}" />51Testing软件测试网1dmH0_1?

0g#aCsW4o5KKL0              <delete dir="${test.report}" />

H&|y-H4M(juB"a0

vS:G#^ a P&XH{"S0              <mkdir dir="${test.report}" />51Testing软件测试网}{+UVeD$~9^

51Testing软件测试网0g1Gt}/lSN

              <delete dir="${test.xml}" />51Testing软件测试网8Ea9SV?"f,L"h

oRrC9}ew m1o(a0e0              <mkdir dir="${test.xml}" />51Testing软件测试网9X] kkL!B(up

51Testing软件测试网_eF9j$GNQ#@_

       </target>51Testing软件测试网q@0Gd%o@

51Testing软件测试网}'MZv1{E9l([G

       <target name="compile" depends="init">

4N?z@ rt051Testing软件测试网 t'G1W;c'z IH%a

              <javac destdir="${run.classpath}" srcdir="${run.srcpath}" />

Ue(L!D1d"A4zh051Testing软件测试网2q+{6Kq$`!t

       </target>

'{S#`mq$Y'j,FDm051Testing软件测试网2[1I'jRNQ A$B

       <target name="junit" depends="compile">51Testing软件测试网-F[+L1oG

+{(@)V B_HZ"|wY _0              <junit printsummary="false">

IRzt-i#h:Y0

H U:FNeo5n%M\0                     <classpath path="${run.classpath}">51Testing软件测试网/Z$L t)x%B-x

51Testing软件测试网ijle~]7f(N

                            <path refid="compile.path" />51Testing软件测试网Yl v'B lo$h \

Z@Q `[*w_,e0                     </classpath>

z,]lr\t0

6]G n*ubh0                     <formatter type="xml" />

@c#B0y|+S+M0

(b!j gh9\g5E/ecAf0                     <batchtest todir="${test.xml}">51Testing软件测试网 y1of5O'[$e!a*q$E

`'A!U5Y8Z0                            <fileset dir="${run.classpath}">

;A*c8[7qO*``051Testing软件测试网7ZX)@\hX%S-J/E

                                   <include name="**/Test*.class" />51Testing软件测试网.NLm3j5L j]

$MP}3d5c7aIwE0                                   <include name="**/*Test.class" />51Testing软件测试网3b MAMF7mD,[3k

51Testing软件测试网F$S ~#d1XiPl8BB,T}

                            </fileset>51Testing软件测试网M/S7yD7MRf

51Testing软件测试网!{L@$o+k}

                     </batchtest>51Testing软件测试网Z1b6H-]U"pH1L q

51Testing软件测试网,P$o C(ZEb3?0\ Y

              </junit>

~(`w}/c+Z-xj0V051Testing软件测试网T;O!}"|;z!ms

              <junitreport todir="${test.xml}">

h}H%?#s:u;Q}0

'f KsH8c0                     <fileset dir="${test.xml}">51Testing软件测试网 WI7WQ Vu"z`x

51Testing软件测试网Q Z$A.W0}

                            <include name="TEST-*.xml" />51Testing软件测试网},P K9Z*~C N:Ep

yw W&so@.f0                     </fileset>51Testing软件测试网ba(PB x$kg4H'M-p

|)Q,Y `j0                     <report format="frames" todir="${test.report}" />

8t-k-@z k#P0

4j"r]nn3@0              </junitreport>

z{zqkTa051Testing软件测试网*t8zN:](N

       </target>

,^Yk ~2za?V051Testing软件测试网p.?*vU j q.x

</project>

(xO[nS6Xr0

jCK6J-vs1?)o(H q!b02.       运行ant 脚本以后,就可以生成相应的junit 日志。

u4a*K)H2DhZAj0

m[V:n/A-L-B051Testing软件测试网B/MWP,z;_
1.selenium 日志51Testing软件测试网sGohaP3imi
当运行junit 脚本时,selenium 相关的脚本就会产生回放日志,但默认记录的东西可读性太差了,所以我们使用loggingSelenium (http://loggingselenium.sourceforge.net/usage.html) ,可以将每个case 可以生成记录selenium 命令的html 格式的result 了。51Testing软件测试网/yY ` _g.]1J UUF

51Testing软件测试网B,N!cX%rPTo)y

4.       plugin 的下载地址:

V h,iJh|@6j0

*A,J_)cf9|E0http://sourceforge.net/projects/loggingselenium/files/loggingselenium/Release%201.2/logging-selenium-1.2.jar/download51Testing软件测试网SF H\-u;{ j[YBu z
5.       安装方法:只需要将下载的logging-selenium-1.2.jar 导入到工程里即可。51Testing软件测试网6X8OLW.[I}

2Ls@#d1m06.       编写代码如下

E3Z4~P'S7G051Testing软件测试网`3r1c+oy4jAF"v

@Before51Testing软件测试网C8s4k2^!zmUSc

%{C.y%Y:@7t6p,B'R$c0public void setUp() {51Testing软件测试网 A8_h2lAGf`u3oe

0\p:xHX0HK1XH0    final String resultPath = "absolute-path-to-where-your-result-will-be-written";

u2v(xH'C051Testing软件测试网6q7fbG0UY

    final String resultHtmlFileName = resultPath + File.separator + "result.html";51Testing软件测试网!{'DkY:ye,SbZZ

*z kDn!z0    final String resultEncoding = "UTF-8"

bmh#y$\|5tlU0

uA vbbhyK:l0    loggingWriter = LoggingUtils.createWriter(resultHtmlFileName, resultEncoding);51Testing软件测试网ovhR/nnz u

51Testing软件测试网b8U Lr7^u:I'k

51Testing软件测试网0d _6\)KTRy ~g

pL6IANTvf&Z0    LoggingResultsFormatter htmlFormatter =

Jt*Bg6RF9[u051Testing软件测试网%Qf1t lY

        new HtmlResultFormatter(loggingWriter, resultEncoding);51Testing软件测试网1I e| wl jc

0zb'_+I&|._6eD0    htmlFormatter.setScreenShotBaseUri(""); // this is for linking to the screenshots51Testing软件测试网Z3Ir|Tf

P4rsG7K;_4e7Q0    htmlFormatter.setAutomaticScreenshotPath(resultPath);

#@2U5j-^'N"xo%NpUX051Testing软件测试网.^s'V l%vzv7^R

    // wrap HttpCommandProcessor from remote-control

M+jr7[^.mX-Z051Testing软件测试网-k"R.I0x ~ iLA}O8G

    LoggingCommandProcessor myProcessor =

$D_?^z8z4T0

w\];WsI1Jg0         new LoggingCommandProcessor(new HttpCommandProcessor(your-configs), htmlFormatter);51Testing软件测试网'M'b(K_qiZ(^G

*ut e'?.mD&h0    selenium = new LoggingDefaultSelenium(myProcessor);51Testing软件测试网.[s5D*zN!G

%o_CF7|2{,y'Uq0    selenium.start();51Testing软件测试网c@*f%IX{~ t Lj

51Testing软件测试网"@bGr$O-hp

}51Testing软件测试网&YR$?/}N:O'jl+`s

7zdrn:ho0@After

itlBK"Fu#t@051Testing软件测试网%}g8r|s

public void tearDown() {51Testing软件测试网9mz n6W*t

yt0lsd0    selenium.stop();51Testing软件测试网+['WAFN

51Testing软件测试网#R#pl!n1cA8To;f

    try {51Testing软件测试网*so!S]#Ku

z3a^a+k!s+P$K0        if (null != loggingWriter) {

O4y;gE-|0

eu,v2x6m3Y'@0            loggingWriter.close();

8qV'V(S[bAnB2mQ0

n_5pR0E0{0        }

uDq9T|z_u0

q)J7C w.`(plN0    } catch (IOException e) {

%`?j1i6j IuT-[+F#aI Rd051Testing软件测试网$j7sx$S!Z%}

        // do nothing

R5A3JZ*]%C1V0

&r+Tq ?U3_2Vc0    }

O)qvP%e0

t0U?gsG@,a'ghK0}

p1W$H*R/kWc0

;R?^zN5ln07.       运行成功以后在指定的目录中生成相应的reports51Testing软件测试网)Tl1b q6Fvg

51Testing软件测试网^;z!_5wBN.T |.AR0j

   七51Testing软件测试网/i&e&V Wz&[b

'vy$? V.~0七、框架优势51Testing软件测试网 J-@dx$\BzJ6K#s"u'x
1.       记录测试的过程,所见即是所得,selenium 的所有内部程序都是用Javascipt 编写的,比较灵活;

9v6fp|n0

7r"|Bq'pEV3gl02.       可以通过selenium IDE 录制脚本,脚本可以回放,可以作为junit 编码的雏形;

Q.[.QM6QV*W3bx051Testing软件测试网&H8h)|;a rm|

3.       支持多种操作系统;51Testing软件测试网"R9q7f#sN

@*r)M0J8N.Q ^04.       支持多种编码语言。JAVA,.NET, Perl, Python,Ruby51Testing软件测试网{Zt+|k(g)?

51Testing软件测试网)mn!F.m$^,U

八、框架劣势

h8]4M [/V4N,~(v2L0

GoY L7t^z$k01.      selenium 的录制工具只能安装在firefox 浏览器上, 如果系统界面不被firefox 支持,那就要花费一定的时间去手写case 。 不过最近听说有一个工具 叫 360WebTester , 可以支持IE 的录制,而且是国产的评价还不错,有时间我要研究一下。

{ l R;k(E051Testing软件测试网W5N*e X3M"G+j

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/congqing2011/archive/2011/02/26/6210553.aspx

5R lC4mJ e1oU0

IHB@?0ky-ebj0

TAG:

 

评分:0

我来说两句

Open Toolbar