进化的测试

关注软件测试,白盒测试,自动化测试,性能测试

Entries Tagged ‘python’

DSL与自动化测试 – 用Python实现简单的DSL

自动化测试,一个在测试领域中被广为熟知,也是被谈论最多的概念之一。DSL (Domain Specific Language),一种高度抽象,用于某个特定领域下编程语言。软件测试在大多数情况下都是对某个特定行业的软件系统进行测试,所以这两者应该可以很好的结合起来,事实上也是这样的,QTP里面的keyword view,其实就是DSL的一个实现。DSL一般可以分为两个大的类型,分别是External DSL 和 Internal DSL (引用自Martin Fowler)。External DSL 一般来说是跟其实现语言不一样的 DSL,常见的External DSL 有:SQL和XML配置文件;而Internal DSL 一般来说就是该DSL使用某个现成的编程语言(就是所谓的host language),然后对host language进行一些改造而成。 我们在测试中会遇到很多问题,其中一些问题,几乎是所有公司所有团队都会遇到的,例如测试覆盖率不够,测试的时间不够等等。面对这些问题,自动化测试自然而然地成为解决这些问题的首选方法。但是自动化测试真的就是银弹麽?不见得!以前曾经在ASP.NET QA 的博客中给他们留言,请教过关于自动化测试的事情,我记得其中有一个回复是说,在某个release中过度地使用自动化测试,一切东西都想实现自动化测试,而忽略了产品本身的功能、特性的关注,结果就是超高的自动化测试覆盖率,但是很差的产品质量。大家都去实现自动化测试了,谁来做功能点的覆盖呢?某些领域的专家(SME),他们可能对测试技术是一无所知的,要把这些领域专家和测试实施结合起来,DSL就是一个比较好的桥梁。 我在工作中遇到的问题是,我需要测试一个类似UV(独立用户访问数)统计的系统,统计UV的方法其实就是根据_uid cookie的值来判断这个用户在某段时间内访问过我们的系统多少次,访问了哪些站点,进行了什么样的行为。其中有2个地方比较麻烦,第一就是在测试过程中要不断地拷贝cookie,这样拷来拷去两三次以后很容易就混乱,出错;第二就是需要记录访问哪些站点,这些站点都只是ID,也是需要不断地修改请求,测试时间长了也是很容易出错。所以我就打算在原来的测试工具基础上,实现一个简单的Internal DSL。先看成品: @tc def uniq_inventory_case01(): test= testTool() test.user(’a').view(’asset55100002′).anetwork(’55100′).onsite(’site55100503′).snetwork(’55100′).dnetwork(’55100′).times(1).go() test.user(’b').view(’asset55100002′).anetwork(’55100′).onsite(’site55100503′).snetwork(’55100′).dnetwork(’55100′).times(2).go() test.user(’b').view(’asset55100002′).anetwork(’55100′).onsite(’site55100504_noad’).snetwork(’55100′).dnetwork(’55100′).times(4).go() 实例化一个testTool对象,然后就是指定哪个用户:user(‘a’)或者user(‘b’),看的视频的ID:view(‘asset55100002′),这个视频属于哪个CRO呢?anetwork(’55100′);放在哪个网站呢?onsite(‘site55100503′);网站是谁的呢?snetwork(’55100′);谁是分发者呢?dnetwork(’55100′);看了多少次呢?times(4);最后一个有点儿丑陋的go()。 像这样子一句话里面N个方法连着用,就叫Method Chaining,Method Chaining通常可以让代码变得更加人性化,读起来更加容易。但是使用Method Chaining通常会遇到一个问题,就是很难判断就是到了哪个方法才是终结呢?是不是有些方法的调用是可选的,有些是必选的呢?其中一个解决方法就是我用到的,放一个.go()方法在最后,作为终结方法。要实现Method Chaining,其实只需要顶一个类,对于需要做连接的方法,最后都返回这个类的实例。例如: def view(self, assetid): if assetid: self.asset_id = assetid return self   def anetwork(self, networkid): if [...]

用Python修改含有日期的文件名

问题:修要修改一些LOG FILE的名字,那些LOG FILE的文件名格式大概是 log-v0-20091012-daily-1a5019a0.csv 。需要修改红色的日期部分,把这个日期改小一点,例如改到20091001。 首先上程序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import time, os, string, sys ONE_DAY = (24 * 60 * 60) if __name__ == "__main__": if len(sys.argv)<2: print "argv error, useage: python " + __file__ + " foldername int" [...]

用Python脚本对ASP.NET站点进行预热

很多人可能都会注意到,当一些新的代码部署到一个ASP.NET的站点后,第一次访问的时候是非常慢的,有可能需要等待超过一分钟;如果我们更新了站点的bin目录下的一些dll文件,那么这种情况会变得更加明显。当第一个页面请求到达服务器的时候,IIS会重新编译文件,这时候可以观察到w3wp.exe和csc.exe都会占用很多CPU。我们不希望用户是IIS重启之后第一个访问者,所以每台服务器在上线之前,都需要做预热处理。所谓预热处理,原理很简单,就是向目标服务器发送一些HTTP请求,从而触发服务器对文件进行编译,实现预热。 为什么用Python?一位大师曾经说过,程序员要每6个月就要学习一门新的语言(这个要求还真苛刻),所以决定学习一下Python。 需求:其实这个需求特别简单 1. 发送HTTP请求,Python自带的httplib库就能满足这个需求了 2. 多线程访问不同的站点,现在MySpace常用站点至少有4个 3. 指定服务器的IP,因为测试的服务器也有多台 4. 获取HTTP请求的状态 5. 需要在登录状态下进行预热

Python中写文本文件的方法

最近在测试一个.NET下面的规则引擎,这个规则引擎用到了IronPython,PYTHON代码是写在配置文件里面的,.NET动态生成一些Python脚本,然后创建一个ScriptContext出来。测试这个动态生成的玩意儿很费劲!所以我就决定把python里面的变量都输出出去,这样就容易调试了。 一、打开文件 代码如下: >>> f = open(“c:\my.txt”, “w”) 说明: open(filename[, mode[, bufsize]])