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

【转】自动化框架搭建

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

51Testing软件测试网%e%z tT!be;V

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

5I&~*l`!\x3k!O$?01.    太过依赖测试工具,高估了工具的力量,最终会以失望告终。51Testing软件测试网tX5~ O*f7wQ|

51Testing软件测试网kUr3I:G7?-\#N

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

A9`_FC4vS9V"z$s0

v"G.Ra5r B J/j#LLx03.     研发和测试人员不能很好的交互,如果这两个角色之间有了一道防火墙,那别说自动化测试了,手工测试也不会有好的效果。测试人员可以把研发想象成自己的女朋友, 努力培养相互之间的感情。51Testing软件测试网4mk6m@[w%xI

1}iZ$CB'M S04.     自动化测试人员实力被低估而导致的情绪低落,这个问题在所有岗位上都会发生,当然要看领导重视程度了。51Testing软件测试网 myDd2C q/QM,r

51Testing软件测试网H"\:M@8{ O-} OU

5.     资源不够,公司不舍得资源投入,或者蹑手蹑脚,那就不要浪费时间了。51Testing软件测试网-S#sTbRd]

K N+h*C*QK;I06.     太高的期望,过低的回报。

o)TX8q&XZUx051Testing软件测试网_pK E[ _3wbW

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

zt]c8t.P0^m f0

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

kQ,Kdwy8Mv;E051Testing软件测试网vB8C` W }xzv

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

cGkv&MZ8lD,N051Testing软件测试网.i2aK5xt]$xdgrB

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

51Testing软件测试网INsp8t.P C

       今天我就简单入个门,先介绍通过junit+selenium+Coverlipse+ant 来搭建一整套自动化测试框架,开始之前我先提出几个问题,请大家根据下面的问题来阅读本篇文章51Testing软件测试网d9|M4G)u] H
1. 如何录制脚本?

6jxbe~&R3\0

l'nlW:u QL(K7g"vw02. 如何转换成junit 脚本?

g.] L.q%b qK$kO&Y+i0

eR!~'CW+i03. 如何生成junit日志?

BD+\*X\T051Testing软件测试网$`ir:}t,f t

4. 如何回放selenium 及查看回放日志?

-gw%j9h U7\D,H0

Y$[2T6`a.\EO05. 如何查看代码的覆盖率?

!CB.B,?[0FtJHx z0

sU)c5E$?5GJ0一、工具准备

:R4NM6nR4s+|)tD}0

;ab@ |%_;D.f[#tJx0gh0
-Py\$w'f)`%N0工具
Q~1DJ O0 说明
P(rq)uB0 下载
i-q.N*J1yY qX0 
}"C+g }JK%}bP0junit
A9B M/~}N_n0 JUnit 是一个开发源代码的Java 测试框架,用于编写和运行可重复的测试。51Testing软件测试网@+H5O F9n(W:GI~4n
 http://www.junit.org51Testing软件测试网%lUXhLG M

iR3K"k1Q*u(d z051Testing软件测试网$Z }A${+r*S0W0R
 51Testing软件测试网R4rHg}Xu'I
selenium
d?4}\'@!}'l0 先介绍两个重要的组件Selenium-IDE 来录制脚本;selenium-rc selenium-remote control 缩写,是使用具体的语言来编写测试类51Testing软件测试网@t+H6`@/Y"A i
 http://seleniumhq.org/download/51Testing软件测试网jOY$t:hH

H(C4Yw e6AZT;_`051Testing软件测试网kg W2_(I3B&?
 
W7t mJ#JMyF0Coverlipse
![2?so1eV O0 Coverlipse 这个Eclipse 插件能够把JUnit 测试的代码覆盖直观化。
(K;lq(r7f0 http://coverlipse.sourceforge.net/download.php51Testing软件测试网MG1F!c4u5HR|@

51Testing软件测试网j8M~]bJ

51Testing软件测试网Y2vJ?#}sWq
 51Testing软件测试网(~5hIqg'Vl
Ant
8AlxRW0 Ant 是一个类似make 的工具, 大家都已经很熟悉了,这里我们可以利用其中的ant task 来生成junit 日志
U%_u"QR*^0 http://ant.apache.org/bindownload.cgi

x-M5K$a R'{;T0

E5l6Y3rS051Testing软件测试网!KX]^W!^{
 51Testing软件测试网0Xum,[S2u

51Testing软件测试网R IC*T#{s4I


!P4o7H l'H kUF0二、Junit 的安装

I@q!dSu/@0

z u h*\a]#@l01.         Eclipse 本身会自带Junit.jar 包,所一般情况下是不需要额外下载junit 的。

X!M w+q2v6B0

-K8S @4S`,Pt"C02.         将junit3 的library 添加到工程的buildPath 中51Testing软件测试网m;B]}4~;I*O

51Testing软件测试网,\ ^,Y!]+w-w/X*V6r/d

3.         因为junit 的日志是通过Ant 来生成的,所以一定要将Junit.jar 添加到ant_home 里

!q CD^#S,F`051Testing软件测试网r {k&w(]2zc(h0@

三、selenium 的安装

3nXo'mSo[!l iO051Testing软件测试网D&QA9X.k`FX(] S!_

1.         安装seleniumIDE ,打开火狐浏览器,然后进入工具—> 添加附件,搜索seleniumIDE51Testing软件测试网/S9Li^R4Z]!u

g3X Fk0]3RQU)~7a'j02.         查询出对应的IDE 后,点击直接安装,安装结束后重启FireFox ,看到下面的菜单说明安装成功51Testing软件测试网iwI(x4["F@q

51Testing软件测试网]9stJz

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

f:VK}.S-\0

*z}-n|XJ%Dn04.         运行java -jar selenium-server-standalone-2.0b1.jar ,启动seleniumserver。为了在运行时应用运行的浏览器与selenium 服务的浏览器分开可在其后面加–multiWindow 。51Testing软件测试网3z9T xma8T xzu

51Testing软件测试网4hI2V#H-V5?@sIq3^

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 。

M%v?0I"AgKvYQo0

:P8I0Q B,J,s8h!\i;C0
}v6H,P#B.J"iP*},fa06.         将制定的Jar 包导入到工程里,然后你就可以集成并使用相应的API ,编写自己的测试CASE 了。

@'HpGy051Testing软件测试网0uw j2s4k)K

四、Coverlipse 的安装51Testing软件测试网rl9DM"n

,|-mA1A$DK2@ `"O7l01.         直接通过Eclipse 即可安装,步骤如下

2@ Zj)]V,l8Y051Testing软件测试网C&D RKhf7S(xg-e

•In Eclipse, click Help -> Software Updates -> Find and Install.51Testing软件测试网Z$QC)V;L4~
•In the dialog, select Search for new features to install, then Next.
&[,Zn.jH0•In the next step, add a New Remote Site. Name it "Coverlipse update site", the URL is "http://coverlipse.sf.net/update/".
By~ Px)u0•Press Finish. Eclipse now searches for the Coverlipse feature to install and shows that to you. 2.         配置 Coverlipse 以获取代码覆盖51Testing软件测试网,\+R2~w{#G
 51Testing软件测试网0n`}4_b#n_S

51Testing软件测试网$N5Sw[ ZG*G

3.         一旦单击了 Run ,Eclipse 会运行 Coverlipse 并在源代码(如图 7 所示)中嵌入标记,该标记显示了具有相关 JUnit 测试的代码部分51Testing软件测试网'r#A'm+Ny"Xi
4.     Coverlipse 生成的具有嵌入类标记的报告51Testing软件测试网w\'Rp8n},m SI#b

-u x%^Fd+g0
6s:OLqmSfG,{^05.      正如您所见,使用 Coverlipse Eclipse 插件可以更快地确定代码覆盖率。例如,这种实时数据功能有助于在将代码签入 CM 系统前 更好地进行测试。51Testing软件测试网,Z^:A,} l:zQ

51Testing软件测试网.ev:[;kp.Q

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

H4?nL} @0

-a\;ea[9i0
M"S Y9c C0六、创建一个案例51Testing软件测试网 A2d:c|Y9i*s Z"@

w`;L7f&K01.         创建一个工程testSelenium 安装下面目录结构

I6Xf+sft~V|0

*q w~*tsw\x02.         录制脚本,打开Firefox 浏览器,进入selenium IDE 菜单

GK.PuS1dNs051Testing软件测试网E&v:f bVf

3.         输入相应录制的地址,点击红色按钮,开始录制

6mwm$hk/f+`051Testing软件测试网*E;B%O2e1g`$` h

4.         将脚本转换成junit 代码,然后将其拷贝到测试类中做为测试CASE 编码的雏形。51Testing软件测试网9W%As;{7p9Xe

51Testing软件测试网5hm u ~F3G\ z

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

)b#]7`)Y5j"v'{t/g)o051Testing软件测试网7S7Y'Vl.D9v5W"j

l          Junit 日志,通过junit 写的断言,和标准输出,这些操作产生的日志记录。51Testing软件测试网;G8]RIb@ p8L

,B.M'r$^IXh0l          Selenium 日志,当运行junit 脚本时,selenium 相关的脚本就会产生回放日志,例如打开界面的url ,标准输入,输出等信息。51Testing软件测试网8u5Lbpm3ZP!f`.U9S

51Testing软件测试网sS)tNd:H)[S.{^k

    虽然这两种日志没有交集,需要分开查看。但一般情况下我们只需要观察Selenium 日志已经足够用了,与其相比Junit 日志更适用于编码阶段。51Testing软件测试网;d+GR{\F$X$]

D9b9S?y'sJ7E,n01.       Junit 日志, 只需要配置脚本build-selenium.xml ,如下

8_#L}AB:v'H0

MEa^#@0MvY?0<project name="seleniumTest" default="junit" basedir=".">

H pfq]2i7]GV0

Y5Id9s RS w%h0b0       <property environment="env" />51Testing软件测试网/x&@'K#jC ].aZ

v*_m bS6K8zi,C0       <condition property="ia.home" value="${env.IA_HOME}">51Testing软件测试网 y6Gv3P;Y{J

51Testing软件测试网!Y9J'f cH'D G.{ ya_

              <isset property="env.IA_HOME" />

fD$K!i vL051Testing软件测试网I2E_~ P;J }

       </condition>51Testing软件测试网]u'u;[(QW

51Testing软件测试网^ @{q(](sjn

       <property name="run.classpath" value="../class">51Testing软件测试网"X#U `'ZSg

51Testing软件测试网*I!{r~BG!j#vpd_

       </property>

)Du;d U.\2f~051Testing软件测试网CY[e9Y r'?~

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

&yW U2zL051Testing软件测试网xe:n e0Q t l d(_

       </property>

*GvB4CJ3NN0^0

7E5^]_*{d$d$Y!F0       <property name="test.xml" value="../xml">51Testing软件测试网{ uQs_]C[ ]

51Testing软件测试网6f+[q5R1Q#b0a#g6^F

       </property>

KbfYK(q#y)x8E0

)B+@#i'k)X }}&J!D/X0       <property name="test.report" value="../report">

7gr\%R$qn0

%i#|LR@6ZT{+E4E`0       </property>

:]3W Q8[.Vq:V051Testing软件测试网 h(m&\ At#?Jf

       <property name="lib.dir" value="../lib" />51Testing软件测试网'?k6iC4q{

6\2V;e6M0a7[1}0       <path id="compile.path">

5S%s0dQ;W F(Q*Q5g051Testing软件测试网:oOg n;cP9z

              <fileset dir="${lib.dir}">51Testing软件测试网U9w2Ju{0D

51Testing软件测试网,A h Cn*QA

                     <include name="junit.jar" />51Testing软件测试网7W9u2Slm{!onV \3j j

51Testing软件测试网%?(v D/c0aIp

                     <include name="ant.jar" />51Testing软件测试网F8o lW$J6D;sU

Kd!Mm-E'FF0              </fileset>51Testing软件测试网!v"SjGO.N5f)U

51Testing软件测试网#|4_2s] d;c~

       </path>

1S"r(y u9@1h0

*_'`J\2kT,D0       <target name="init">

&d#cb4ZG9?W0

9e9m9V7|dM.c0              <delete dir="${run.classpath}" />51Testing软件测试网o[9^+g+Hu&S

G6K,{$T,sRVK%IS@0              <mkdir dir="${run.classpath}" />51Testing软件测试网5jW2RAJ

51Testing软件测试网Cf0l O c[C*r&Dr

              <delete dir="${test.report}" />

^+y*a)rWJ6N~W0

3q5z4A$GK[u5D7Z0              <mkdir dir="${test.report}" />51Testing软件测试网;jU#M5jhW j0eu

[h)Am&F}Wqn/x0              <delete dir="${test.xml}" />

6Wa3H j.S;r7Tf{051Testing软件测试网A1k(pms

              <mkdir dir="${test.xml}" />

f0z$`BK-Q ].M-[051Testing软件测试网jZ5O-|Zp

       </target>51Testing软件测试网&[x`4u x,i

8WA-M x#Do/{7|B+]R0       <target name="compile" depends="init">

i k3I"m0Doi$r;J4o#?051Testing软件测试网2a5W\3aW`r$W ^

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

qE iWL(n051Testing软件测试网%qf%k%B5s3]n3`

       </target>51Testing软件测试网fH,|.[m,E

51Testing软件测试网?A5{h&J9V(r-D9R]c1k

       <target name="junit" depends="compile">51Testing软件测试网k+NV.s`$k|;t*[1X

`x:]Wl b i } r0              <junit printsummary="false">51Testing软件测试网JG6?`(rkg~

51Testing软件测试网O\-_9?F e

                     <classpath path="${run.classpath}">

:Q]Lj7|fuLM051Testing软件测试网MJ4@y)ch0d

                            <path refid="compile.path" />51Testing软件测试网i6iZ%BB v

51Testing软件测试网`W5|A ngU

                     </classpath>

0LWqo8y/z!qI051Testing软件测试网c~bv/vR a

                     <formatter type="xml" />

zd"]H v)h3Xt${051Testing软件测试网5z e pFY3A,^

                     <batchtest todir="${test.xml}">51Testing软件测试网Z&[Iw I}%t,O

W9f%NR p~m+L0                            <fileset dir="${run.classpath}">

0YD0{2f_o0

r)C2uZz"H(UDi0                                   <include name="**/Test*.class" />51Testing软件测试网!M0PL[mUk3?

+nR#E"M n v!},e0x0                                   <include name="**/*Test.class" />

#b!x,E_*O]0

YON'i5OHVD3U0                            </fileset>51Testing软件测试网+A X&R3^@{(u

51Testing软件测试网1VU] E"px

                     </batchtest>51Testing软件测试网 g2CE-wH-z

*UW s u!h:J!V#I0              </junit>51Testing软件测试网C*r|:Q(Yx9]

$r*R2X)\6W6gp0              <junitreport todir="${test.xml}">51Testing软件测试网]h6qnD}F

51Testing软件测试网aC7F$r1t&T4t

                     <fileset dir="${test.xml}">51Testing软件测试网 tQ*Q9e(Q"v

51Testing软件测试网R-zg J{

                            <include name="TEST-*.xml" />

3`a)|F?$J/p0

!\2j KR+Hb1h*Q k0                     </fileset>51Testing软件测试网b,u"l0XC

c3^p-z&AaL0                     <report format="frames" todir="${test.report}" />51Testing软件测试网Q:\"rNJ

51Testing软件测试网-Cj5g7z"?5Fo:_3E`

              </junitreport>51Testing软件测试网#xY&O.zH_#dz^

1@6n+a y-F:HN8@0       </target>

3r fW[M:gckb0b6N051Testing软件测试网4U)Fa0T"Jj*_2j

</project>51Testing软件测试网;fZ \zbs4Zgh:f3c

51Testing软件测试网NR YCl y@0R

2.       运行ant 脚本以后,就可以生成相应的junit 日志。51Testing软件测试网#q3?"i:U7T

*? U*NM(]-cOU051Testing软件测试网A5dq'~)t
1.selenium 日志
W/|O?4H6_ \0当运行junit 脚本时,selenium 相关的脚本就会产生回放日志,但默认记录的东西可读性太差了,所以我们使用loggingSelenium (http://loggingselenium.sourceforge.net/usage.html) ,可以将每个case 可以生成记录selenium 命令的html 格式的result 了。51Testing软件测试网0\8kk[\V"GDJ

;t,o.|;w]r.T04.       plugin 的下载地址:51Testing软件测试网0HJM ^9I-J

a6dH}w2u[J5Z,k0http://sourceforge.net/projects/loggingselenium/files/loggingselenium/Release%201.2/logging-selenium-1.2.jar/download51Testing软件测试网bM F[0c.t
5.       安装方法:只需要将下载的logging-selenium-1.2.jar 导入到工程里即可。51Testing软件测试网tT x^&p1|J

51Testing软件测试网d%q&g)E M

6.       编写代码如下51Testing软件测试网7uBFg0opg

51Testing软件测试网 t0x1sw+\ i&m

@Before51Testing软件测试网%c |P(_)qmV

51Testing软件测试网k'K g6]"d QkMe

public void setUp() {

FD4sQs!L0

%o0bTS(IB d{5T)F0    final String resultPath = "absolute-path-to-where-your-result-will-be-written";51Testing软件测试网j i/[m a

51Testing软件测试网A)o)g.^#cw!^

    final String resultHtmlFileName = resultPath + File.separator + "result.html";51Testing软件测试网)ed&Sn p{

d2ggP {/o{0    final String resultEncoding = "UTF-8"

j8u3p!^ }051Testing软件测试网 N6kx_\k;g3K

    loggingWriter = LoggingUtils.createWriter(resultHtmlFileName, resultEncoding);

i |NH `%^051Testing软件测试网 H3yM\\3D PS [

51Testing软件测试网K;JX!^mV

51Testing软件测试网4A,H-v r&M}@o g

    LoggingResultsFormatter htmlFormatter =

O"_5VV@s9D0

Z.q;I#S|7J0        new HtmlResultFormatter(loggingWriter, resultEncoding);

JZ1cS"NRN0

)v-@;D)hn7rY)Tq X7X0    htmlFormatter.setScreenShotBaseUri(""); // this is for linking to the screenshots

f8w2I;_4Kr"tn)R051Testing软件测试网5K;g@q+x5Dl

    htmlFormatter.setAutomaticScreenshotPath(resultPath);51Testing软件测试网HdLx `ub-W

8h l"z1};ag9\G0    // wrap HttpCommandProcessor from remote-control51Testing软件测试网a7V(BWb E~5T

51Testing软件测试网(d"~F+d5y

    LoggingCommandProcessor myProcessor =

/U#zCZzO0

s(N}ry(L%}0         new LoggingCommandProcessor(new HttpCommandProcessor(your-configs), htmlFormatter);51Testing软件测试网e5]dY6?P K#d

51Testing软件测试网b/h8otN0`

    selenium = new LoggingDefaultSelenium(myProcessor);51Testing软件测试网KP`r1z"^

51Testing软件测试网Qn/}m8{)bjSP+z

    selenium.start();

Jf kGP051Testing软件测试网+MKJ xr,N"U(c

}51Testing软件测试网H8p#l"SHO#~

7^L%J%X,SL0@After51Testing软件测试网/@ ^2n!Dj

51Testing软件测试网4L4xr0Y(B1d`

public void tearDown() {

#n sB;a8FFv0

5a?x+fn&aTG3`0    selenium.stop();51Testing软件测试网oObC+hQY8i

P x k)Nv0    try {

(L:N+P4nU\R D*A051Testing软件测试网TF@/R5G

        if (null != loggingWriter) {

.N"\M A;K2oc-@6n]0

thM2^5Ecbeg u0            loggingWriter.close();

3`l/iU[0

MP!P%o IP?B |6Z0        }

HH0M7\ ^H jZj T051Testing软件测试网5hTz*s sB'\ } QV

    } catch (IOException e) {

&`{ZH[(me@7V7m0

5K,q4aZ!A+tsb-t-O7C0        // do nothing

)W7B:Poo5ub0

-X L6LeQ6i0    }51Testing软件测试网%}"UT2cXA;E

,[k I)TA0}

0QCG;Y7A}CT(Yr8D/g051Testing软件测试网k9q4l+M P

7.       运行成功以后在指定的目录中生成相应的reports

My2EB`?,I-rG|0H0

]2B!L`1l&GY0   七

S#Z @g%qq4S K'w?0

){Z it0oT0七、框架优势51Testing软件测试网*Z*J~k+j1q2k'}av
1.       记录测试的过程,所见即是所得,selenium 的所有内部程序都是用Javascipt 编写的,比较灵活;

1qU&t[D+K |o0

c aC6WDS(tOU02.       可以通过selenium IDE 录制脚本,脚本可以回放,可以作为junit 编码的雏形;

&SB'O/N @E0

~Yg qlpG"`03.       支持多种操作系统;51Testing软件测试网Bt6Co-h z7v ru]

51Testing软件测试网&y Y9eErnb

4.       支持多种编码语言。JAVA,.NET, Perl, Python,Ruby51Testing软件测试网"DF5t n|@Z

51Testing软件测试网$Q D-wU|2ET

八、框架劣势

C9r+Mv qv9m7s051Testing软件测试网|n jAf+o7W

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

|Q2}J&n WSl051Testing软件测试网4[kD4{CHc~-_

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/congqing2011/archive/2011/02/26/6210553.aspx51Testing软件测试网I#u Q iT)vj


I@ L$CV'D v0

TAG:

 

评分:0

我来说两句

Open Toolbar