一个菜鸟测试工程师的简易自动化测试框架
上一篇 / 下一篇 2012-09-07 11:24:05 / 个人分类:自动化测试
P9b6d!F:?0 引子
T}YJlr6uH&y-v0lp]RjI0 作为一个无 dev 经验的 tester 来说,目前遇到许多新的问题,关于 tester 以后的人员基本素质的构成,现在也有许多说法,在这里,不想过多的铺开讨论了。 作为一个 tester,本身当然必须对test这件事情感兴趣,才能把工作做好。 有的人天生喜欢找茬,喜欢提意见,在我看来,就是一个不错的 tester 的料。 当你天天对着同一个产品的不同版本不停的测试的时候,自然会产生一些怨言,由此产生懈怠。51Testing软件测试网 [ Z`X4A*mhQI3U T!I
51Testing软件测试网A2W6z._Z4b5O-g“某些功能点我都连着测试了 N 个版本了,肯定不会出错了” “这种基本功能点,怎么可能出错”这样的论调是很有可能产生的。于是,一个 tester 很有可能在某次 release 的过程中,经验主义的放过了某些功能点的测试。 几天后,一个用户反馈上来,那个功能点出了问题.........
CSvz9@051Testing软件测试网*Fk2Vk?A“偷懒”这个词语,在测试过程中,不应该算一个贬义词(当然了,故意漏过功能点不测试,不在此列)。因为“偷懒”催生新的技术,“偷懒”节省更多的时间。 我相信,自动化测试就是这样来的。
n GB\#|BvA0E [|9Y)z/f?0 正题51Testing软件测试网WQF$b8Z(k
+r:mE.n}O;Q4f0u+Q0 任何事情都可以分解为很小的部分,让我们先分析一下,手工执行测试案例的一个过程:51Testing软件测试网yK3Lj+?v6z ~
51Testing软件测试网5WCZ-zh&~#g;Y{%B打开被测软件51Testing软件测试网9q+ZYCj
\$_#f+AN b~@0 执行测试案例
.vaJY_ T4\X05Ej1Dd9Xk2dvb0 给出测试结果
3K'M{XS/kt0B_Y_fEA)rd0 然后,我们不断重复这个过程。 最后给出测试报告。
O$@-P/g_%Y7u051Testing软件测试网*X8@ P{U\"o显然,我们的自动化测试也要满足上面的这个过程中的所有要求。 既然是自动化,首先要求是所有的测试用例可以无人值守运行;其次,每个测试用例都由机器来模拟人对软件的操作;第三,某个测试用例失败不能影响其他测试用例的继续执行;第四,测试数据和测试用例最好分离开来;最后一点,测试结束之后,给个报告或者给个图告知测试结果。
x?!Bh4k]0W4LU&Q)Xm/f:@,oM0 根据上面的分析,我们逐个来一一解决,当然了,本篇都是很初级的解决方式,相信有许多大牛会有更好的方式来解决。
*df*j `1[N[0A/\{X*n wX0 无人值守运行,那么 python 的 unittest 的框架就能达到这个目的。51Testing软件测试网2L#C m"\L,I(t)l$P3?eK
51Testing软件测试网"UEk'X W9jt&M5NZ)U模拟人的操作, selenium 可以胜任。
g"Nf&d(N,m0hB6@Q8cU0 测试用例间无影响, 同1
e#lypx7FDg6i051Testing软件测试网,a2w M@a A Z1p数据分离, 那把测试数据都扔xml里。51Testing软件测试网C(z4_-C6Q[Uy
8d3ga[:K7c0 待完善 (本例中 只是在部分方法中添加错误提示)
1i%o;u#{5o051Testing软件测试网1AB?FA]U{(M?开始动手
m5T-a5qj051Testing软件测试网$~S5\P,g/c对 python 的 unittest 进行一些小手术,当然了,如果只追求简单,直接用也行。51Testing软件测试网2V,DkRM&~ r
def assertLogEqual(self, arg1, arg2):51Testing软件测试网i)T r ^4Pgprint "[assertLogEqual('"+arg1+"', '"+arg2+"')]: "51Testing软件测试网 x K0fjw+K5D
if arg1 != arg2:
,y)p)t!G|0self.anyfailure = True
?2yAPRP0print " -> Failed: not equal"51Testing软件测试网qXDd+hMu!|!p
self.result_note = " '%s' and 's%' is not equal\n "%(arg1,arg2)
%nxS%Yp~@3]hX6XF1o0else:51Testing软件测试网t ?y^/a.RH X
print " ->OK"
yAZ7}:~ L5Afjh0self.result_note = "%s OK\n" % self.result_note51Testing软件测试网f)~.r'Qq
self.assertEqual(arg1, arg2)51Testing软件测试网8w"WnU7x8@ q
def assertLogTrue(self, arg1, note=""):
KV2_ ^6UA E0print "[assertLogTrue("+str(arg1)+")]: "+note
v4c ]~5Q Dr0if arg1 is False:51Testing软件测试网gb F'av"E|F
self.anyfailure = True51Testing软件测试网rJZ[MO
print " -> Failed: Excepting True"51Testing软件测试网Q?5V"K!OF*caj6mK
self.result_note = " %sError: %s\n " % (self.result_note, note)
!VTiD e~c0else:
I-mwq5B8I5w6wV2F0print " ->OK"
*y$W-KI2DLSv0self.resulte_note = "%s OK\n" % self.result_note
&VrdqTy B k0self.assertTrue(arg1)51Testing软件测试网|$Oo HPN}
def assertLogFalse(self, arg1, note=""):
S.j#j M(d4LMt0print "[assertLogFalse("+str(arg1)+")]: "+note51Testing软件测试网sD(k,KnIn
if arg1 is True:
fXZ"qTm7t-F0print " ->FAILED: Expecting False."
n+?0Dw$g ^0self.anyfailure = True51Testing软件测试网 ^ V+`m5]/M
self.result_note = "%sError: %s\n" % (self.result_note, note)51Testing软件测试网 Y!d9we:S3IU
else:
#g/V&M3W \/fhdQV0self.result_note = "%sOK\n" % self.result_note
fej8C'z%PBd+r0print " ->OK"
e U7s)^6? uH{0self.assertFalse(arg1)
p^o^k YFXl051Testing软件测试网 ]P+u%r*W`/U!y J
自己新建一个类,继承unittest,然后修改必要的一些方法,并添加部分方法,譬如设置testName啊,设置标记值来标记case知否执行结束啊。这些都是可以根据自己喜好来加入的方法。51Testing软件测试网p6G)Rc7s2Y!IM%I\
xM%p{;B d0
z/@%_OO*f3l h0def setTestName(self, tname):51Testing软件测试网J(i_+^)[
O self.testname = tname GNl)g1_,bF |"_)q"fr0def getTestName(self):51Testing软件测试网*i%K?hO4cvW return self.testname51Testing软件测试网i| Y0O btp def setCompleted(self):51Testing软件测试网B Nd#e;t7K,]#H self.completed = True51Testing软件测试网-m N!}aQ-M def isCompleted(self): ,X2@Y F#w{J`h%^z0return self.completed |
1l4V$K(|'Pt%`N0 对于unittest框架的修改 就写这么多。51Testing软件测试网/O-xh$Rk)[+}Y8`Rm
fl A&U[e7M0 对selenium的基本方法做一些小改动,动机优化 unittest 框架一致,只是为了让你的用例跑起来的时候更加让人理解。我们相当于在 selenium 的基本方法外面又封装了一层。下面是部分方法示例:51Testing软件测试网(o*F ^Sl&^.Mm^
\-j N]1dWPE0M r&M0
J)e&Y0l/f$Ha0def open(self,url):51Testing软件测试网6\M0u%xR[Cs self.sel.open(url)51Testing软件测试网 oIEy8k.`A def GetValue(self, element):51Testing软件测试网*[8q S^ud'c value = self.sel.get_value(element) ^:eZM0MJ`/vm#B:c1u0self.assertLogTrue(True, "Value for element %s is %s" %(element, value))51Testing软件测试网 Ko-uN?#Q%g0zGG[ return value 4h!tb(?2u ?8S*`0def isTextPresent(self, text): 'X0v.Qh^4h4d q}7s0val = self.sel.is_text_present(text) *I cX&P1m |