记得原来在一个公司时,具体很多原因,testlink上项目中的用例都需要执行形成漂亮的报告,但实际测试中又不需要去执行,所以就必须将用例根据上一次测试报告一个一个手工去贴结果刷用例,几百条用例,几天就浪费了,做完还什么都没获得。正好这二天没事,就用python写一个自动执行的小程序!~~~~~
思路:从测试计划及测试报告中提取caseID,及测试结果,使用webdriver去执行用例,使用yaml配置文件,将测试产品、测试计划、报告设成可配
需安装selenium、yaml组件
在TestLink 1.9.13上成功运行
代码是王道,直接上代码,如下:
#coding:utf-8 ''' Created on 2015-11-6 @author: Administrator ''' from selenium import webdriver from selenium.webdriver.support.ui import Select import time,random import re,os import urllib2 import yaml print os.path.dirname(__file__) #获取当前文件绝对路径 try: f=open('testlinkauto.yaml') datadict=yaml.load(f) testconfig=datadict['testlink'] except Exception,e: print "The error is :",e start=time.clock() chrome_driver_path=r'C:\Program Files (x86)GoogleChromeApplicationchromedriver.exe' #这里使用chrome,所以必需下载chromedriver驱动,否则无法执行 browser = webdriver.Chrome(chrome_driver_path) print testconfig.get('address') browser.get(testconfig.get('address')) #登陆 browser.find_element_by_id('login').clear() browser.find_element_by_id('login').send_keys(testconfig.get('user')) browser.find_element_by_name('tl_password').send_keys(testconfig.get('password')) browser.find_element_by_name('login_submit').click() time.sleep(2) #执行用例程序 def testCaseWrite(resultdict): for case,result in resultdict.items(): print "%s The case is %s and result is %s" % (time.strftime('%Y-%m-%d %H:%M:%S'),case,result) browser.switch_to_default_content() #切回默认的frame browser.switch_to_frame('mainframe') #切到主frame #切到左侧例表frame browser.switch_to_frame('treeframe') #选择要执行的用例 browser.find_element_by_name('filter_tc_id').clear() browser.find_element_by_name('filter_tc_id').send_keys(case) browser.find_element_by_id('doUpdateTree').click() browser.find_element_by_id('expand_tree').click() time.sleep(2) #browser.find_elements_by_css_selector("//a[@href='javascrpit:ST(29,30)']").click() #browser.find_element_by_xpath('//*[@id="ext-gen21"]/li/div/a').click() #browser.find_element_by_xpath('//*[@id="ext-gen21"]/li/div/a').click() browser.find_element_by_xpath("//a[contains(@href,'javascript:ST')]").click() #点击执行 time.sleep(5) #切换至右侧的用例frame browser.switch_to_default_content() browser.switch_to_frame('mainframe') browser.switch_to_frame('workframe') #写执行记录并确定提交 #browser.find_element_by_class_name('step_note_textarea').send_keys(u'成功') #browser.find_element_by_id('notes').send_keys(u'成功') browser.find_element_by_xpath("//textarea[starts-with(@name,'notes')]").send_keys(result.decode('utf-8')) time.sleep(2) #Select(browser.find_element_by_name('statusSingle')).select_by_value("p") #选择项目 Select(browser.find_element_by_xpath("//select[contains(@name,'statusSingle')]")).select_by_value("p") #//*[@id="step_status_31"] time.sleep(1) browser.find_element_by_xpath("//input[contains(@name,'save_results')]").click() time.sleep(random.uniform(2,4))#获取测试计划用例列表并去重排序 def getTestPlan(url): date=urllib2.urlopen(url).read() varpatten=testconfig['testprojectid']+'-d{1,5}' testlist=re.findall(varpatten,date) aa=list(set(testlist)) aa.sort(key=lambda x:int(re.match('D+-(d+)',x).group(1))) #根据ID来排序 return aa #获取原来测试报告中用例及执行结果对应字典关系 def getTestResult(url): date=urllib2.urlopen(url) data=date.read() global caselist varpatten='测试用例 ('+testconfig['testprojectid']+'-d+)' print varpatten caselist=re.findall(varpatten,data) #caselist=re.findall('测试用例 (GX-d+)',data) resultlist=re.findall('执行备注.*?">(.*)</td',data) return dict([(x,y) for x in caselist for y in resultlist ]) if __name__=='__main__': #定位工具栏选项 browser.switch_to_frame('titlebar') #切换到iframe为titlebar上 print browser.current_url #browser.find_element_by_name('testproject').click() #遍历下拉框并选择需要的项目 select = browser.find_element_by_name("testproject") allOptions = select.find_elements_by_tag_name("option") for option in allOptions: print "Value is: " + option.get_attribute("value") print "Text is:" +option.text if testconfig['testprojectid'] in option.text: option.click() break time.sleep(5) browser.find_element_by_xpath("//img[@title='执行']").click() #执行用例 browser.switch_to_default_content() #切回默认的frame browser.switch_to_frame('mainframe') #切到主frame print browser.current_url #执行程序 TestPlanCase=getTestPlan(testconfig['testplanurl']) TestResultCase=getTestResult(testconfig['testreporturl']) print TestResultCase #未有结果的列表并排序 print "计划中要执行的用例列表:" ,list(set(TestPlanCase)) print "原测试报告中已执行的用例列表:",list(set(caselist)) unuse=set(TestPlanCase)^set(caselist) unuselist=list(unuse) unuselist.sort(key=lambda x:int(re.match('D+-(d+)',x).group(1))) print "此次未执行的case列表为:",unuselist print "总共%s个!" % len(unuselist) print "大约要花费%d分钟" % (len(unuselist)*14/60) #执行 print TestResultCase testCaseWrite(TestResultCase) end=time.clock() print "执行结束,总共花费%6.2f 秒时间" % (end-start) ''' #定位测试计划并选用 browser.switch_to_default_content() browser.switch_to_frame('mainframe') print browser.current_url print testconfig['testplan'] browser.find_element_by_xpath("//div[contains(@class,'chosen-c')]/div/ul").click #browser.find_element_by_xpath("//div[contains(@class,'chosen-c')]/div/ul/li[3]").click #browser.find_element_by_xpath("//div[contains(@class,'chosen-c')]").click() #WebDriverWait(browser,10).until(lambda the_driver: the_driver.find_element_by_tag_name('li').is_displayed()) #menu=browser.find_element_by_tag_name('li').find_element_by_link_text('GXVCP_IOS_D10V100_rc4') #webdriver.ActionChains(browser).move_to_element(menu).perform() #drop_down=browser.find_element_by_xpath("//div[contains(@class,'chosen-c')]/div/ul") print drop_down time.sleep(1) #browser.find_element_by_link_text('GXVCP_IOS_D10V100_rc4') allOptions1 = drop_down.find_elements_by_tag_name("li") print allOptions1 drop_down.find_element_by_link_text('GXVCP_IOS_D10V100_rc4') browser.find_element_by_name('testplan') Select(browser.find_element_by_name('testplan')).select_by_visible_text(testconfig['testplan']) ''' 最后这个在定位测试计划时,一直定位不出来,所以还是得手工点击测试计划。
yaml配置文件内容:
testlink:
address: http://192.168.3.247:8080/testlink/login.php
user: xxxxx
password: 111111
testprojectid: GX
testplanurl: file:///F:/Private/testplan%20GXVCP_IOS_D10V100_rc3.htm
testreporturl: file:///F:/Private/testreport%20GXVCP_IOS_D10V100_rc4.htm
--更新,为了执行用例时间上不一致,使用random函数进行sleep,time.sleep(random.uniform(2,4))
测试计划定位方法已找到:详细见http://www.cnblogs.com/landhu/p/5010723.html
这里就不更新刷用例的程序了,有需要的朋友自行完善!
如使用有问题,请联系:
362299908@qq.com