• Testlink自动执行用例小程序


        记得原来在一个公司时,具体很多原因,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

  • 相关阅读:
    apache重写规则自动追加查询参数QSA
    错误代码2104:无法下载Silverlight应用程序。请查看Web服务器设置
    eclipse的shell相关插件
    二叉树及排序二叉树的相关操作汇总
    约瑟夫环
    c++ 输入一行字符串
    类对象做函数参数(传值和传引用)
    运算符重载(=和+)
    char型字符串(数组)与string型字符串 指针与引用
    一维和二维数组 动态内存分配
  • 原文地址:https://www.cnblogs.com/landhu/p/4958594.html
Copyright © 2020-2023  润新知