当前位置: 传客网 > ruby 自动测试脚本

ruby 自动测试脚本

2016-12-30 作者:Abel

     最近在上海阿尔卡特实习,写了一个自动测试脚本,感觉ruby学习和理解更加深刻,也觉得ruby用起来相当方便,总之,ruby不愧是处理文本和网络方面的杀手,一击必中,是一把锋利的神器,值得学习。
下面就是我的代码,具体分为三个文件:
main.rb主要是与用户和服务器交互,也是程序开始执行的主程序,其中用到了ruby中net的telnet和ftp模块。
transfer.rb主要对一些xml文件做一些处理,其中用到了rexml中document模块,是一种非常方便的dom技术。
results.rb主要是获取经过处理和测试后,从log文件中获得我们需要的结果。
其中,为了使我写的ruby程序运行在没有安装ruby解释器的机子上,也就是说,具有移植性,我用ocrasa.rb把ruby脚本程序转换成一个windows下可执行的exe程序,这样只要点击红宝石一样的main.exe,程序就能自动运行,非常方便。
以下就是三个具体代码及其注释:
main.rb
require 'net/telnet'
require 'transfer.rb'
require 'results.rb'
require 'net/ftp'
require 'uri'
require 'open-uri'
   
    count = 0
    local_fname = []
    remote_fname = []
    sendreq_fname = []
   
    Dir.foreach("xml") do |file|
        # puts file
        filename = /xml/.match(file)
        if filename !=  nil
            # puts "xml/"+filename.to_s
            local_fname[count] =  "xml/"+file
            remote_fname[count] = "SRT/"+file
            sendreq_fname[count] = file
            count = count + 1
        end
    end
   
    count = count - 1
    countA = (0..count).to_a
   
    # local_fname = ["xml/c_e8-c_add_sq.xml","xml/c_e8-c_add_jq.xml","xml/c_e8-c_addvo_sq.xml","xml/c_e8-c_addvo_jq.xml"]
    # remote_fname = ["SRT/c_e8-c_add_sq.xml","SRT/c_e8-c_add_jq.xml","SRT/c_e8-c_addvo_sq.xml","SRT/c_e8-c_addvo_jq.xml"]
    # sendreq_fname = ["c_e8-c_add_sq.xml","c_e8-c_add_jq.xml","c_e8-c_addvo_sq.xml","c_e8-c_addvo_jq.xml"]
   
    serv_type = ["C","T","U","BC","Z","BM","X"]
   
    order = nil
    xml_d = nil
    serv_type_d = nil
   
    input_again = true
    while input_again == true
   
        input_again = false
       
        #初始化订单
        puts "请输入一个序列号用于生成订单号:"
        order = gets().chomp

        if order.empty? == true
            input_again = true
            puts " 错误:序列号不能为空,请重新输入。"
            next
        end
        puts "您输入的序列号如下:"
        puts order
        puts "请输入你要测试的xml文件,其中"
        for i in countA
            puts i.to_s + "代表"+sendreq_fname[i]
        end
        puts "要测试多个xml文件,请用空格分开:"
        xml_decision = gets.chomp
        xml_d = xml_decision.split(" ")
        if xml_d.empty? == true
            input_again = true
            puts " 错误:你的输入为空,请重新输入。"
            next
        end
        #检查输入的合法性
        for ii_s in xml_d do
            ii = ii_s.to_i
            if ii<0 || ii>count
                puts "错误:您输入的数字不合法,必须在0到"+count.to_s+"之间!!"
                input_again = true
                break
            end
        end
        if input_again == true
            next
        end

        puts "您选择测试的xml文件如下:"
        for ii_s in xml_d do
            ii = ii_s.to_i
            puts sendreq_fname[ii]
        end
   
        puts "请输入你要对这些以上xml测试的serv_type类别,其中
        0代表C类型
        1代表T类型
        2代表U类型
        3代表BC类型
        4代表Z类型
        5代表BM类型
        6代表X类型
        要测试多种类型,请用空格分开:"
        serv_type_decision = gets.chomp
        serv_type_d = serv_type_decision.split(" ")
        if serv_type_d.empty? == true
            input_again = true
            puts " 错误:你的输入为空,请重新输入。"
            next
        end
        #检查输入的合法性
        for jj_s in serv_type_d do
            jj = jj_s.to_i
            if jj<0 || jj>6
                puts "错误:您输入的数字不合法,必须为0,1,2,3,4,5或者6!!"
                input_again = true
                break
            end
        end
        if input_again == true
            next
        end
        puts "您选择测试的serv_type类别如下:"
        for jj_s in  serv_type_d
            jj = jj_s.to_i
            puts serv_type[jj]
        end
    end #end while
   
    # 初始化所有xml文件
    for i in [0,1,2,3]
        initOrder(local_fname[i])
    end
   
    order_no = [order+"addsq_",order+"addjq_",order+"addvosq_",order+"addvojq_"]
   
    #telnet连接
    puts "telnet正在连接..."
    telnet = Net::Telnet.new("Host" => "10.7.3.32") {|c| print c}
    telnet.login("******", "******") {|c| print c}
    telnet.cmd("ls") {|c| print c}
    telnet.cmd("cd SRT")
    puts "telnet连接成功..."
    #ftp连接
    puts "ftp正在连接..."
    ftp = Net::FTP.new()
    ftp.connect("10.7.3.32",21)
    ftp.login("******", "******")
    puts "ftp连接成功..."

    for i_s in xml_d do 
        i = i_s.to_i #i_s是string 类型,需要转化成Int类型才能够作为数组的Index
        local_f = local_fname[i]
        remote_f = remote_fname[i]
        # ftp.get(remote_f,local_f)
       
        for j_s in serv_type_d do
            j = j_s.to_i
            serv_t = serv_type[j]
            if j<4
                for k in ["0","1","2"] do
                    home_gateway_flag = k
                    order_n = order_no[i] + serv_t +home_gateway_flag
                    puts "请求订单号:" + order_n
                    oldReplaceNew(local_f)
                    modify(local_f,order_n,serv_t,home_gateway_flag)
                    ftp.put(local_f,remote_f)
                    sendreq_f = "sendreq " + sendreq_fname[i]
                    telnet.cmd(sendreq_f)
                end       
            elsif j<6 && j>=4
                for k1 in ["0","1","2"] do
                    home_gateway_flag = k1
                    order_n = order_no[i] + serv_t +home_gateway_flag
                    puts "请求订单号:" + order_n
                    newReplaceOld(local_f)
                    modify(local_f,order_n,serv_t,home_gateway_flag)
                    ftp.put(local_f,remote_f)
                    sendreq_f = "sendreq " + sendreq_fname[i]
                    telnet.cmd(sendreq_f)
                end   
            else
                for k2 in ["0","1","2"] do
                    home_gateway_flag = k2
                    order_n = order_no[i] + serv_t +home_gateway_flag
                    puts "请求订单号:" + order_n
                    insertNew(local_f)
                    modify(local_f,order_n,serv_t,home_gateway_flag)
                    ftp.put(local_f,remote_f)
                    sendreq_f = "sendreq " + sendreq_fname[i]
                    telnet.cmd(sendreq_f)
                end   
            end
        end#0123456
    end #0123

    # 把日志文件传送回来
   
    t_mml = Time.now
    file_today_mml = t_mml.strftime("%m%d")
    file_remote_mml = t_mml.strftime("%Y%m%d")
    # 创建当天本地log文件夹
    if (File.directory?'log/'+file_today_mml) == false
        Dir.mkdir("log/"+file_today_mml)
    end
   
    log_remote_fname = "DATA/logs/"+file_remote_mml+"/JNEP_PRO3.diag"
    log_local_fname = "log/"+file_today_mml+"/JNEP_PRO3.diag"
    ftp.get(log_remote_fname,log_local_fname)
   
    getResults(order)
    telnet.cmd("exit") {|c| print c}
    telnet.close
   
transfer.rb
require 'rexml/document' 
    include REXML 
    ################################函数定义区##################################
    #初始化订单号
    def initOrder(str)
       
        filedoc_order = File.open(str,"r")
        doc_order = Document.new(filedoc_order) 
        root_order = doc_order.root
       
        if root_order.elements["serviceProperty_new"] != nil && root_order.elements["serviceProperty_old"] != nil
           
            file_order = File.open(str,"r")
            initFile = File.new("temp/initFile.xml","w")
            write_order = true
            file_order.each do |order_line|
                if order_line =~ /<serviceProperty_new>/
                    write_order = false
                end
                if write_order == true
                    initFile.puts order_line
                end
                if order_line =~ /<\/serviceProperty_new>/
                    write_order = true
                end
            end
           
            file_order.close
            initFile.close
            initFile = File.new("temp/initFile.xml","r")
            file_order = File.open(str,"w")
            initFile.each do |init_line|
                file_order.puts init_line
            end
            file_order.close
            initFile.close
        end
        filedoc_order.close
        oldReplaceNew(str)
    end
   
    #修改old为new元素
    def newReplaceOld(str)
       
        file = File.open(str,"r")
        newReOld = File.new("temp/newReOld.xml","w") 
        file.each do |line|
            # file2.puts line
            if line =~ /<serviceProperty_old>/
                line.replace('    <serviceProperty_new>')
                newReOld.puts line
            elsif line =~ /<\/serviceProperty_old>/
                line.replace('    </serviceProperty_new>')
                newReOld.puts line
            else
                newReOld.puts line
            end
        end
        newReOld.close
        file.close
       
        file = File.open(str,"w")
        newReOld = File.new("temp/newReOld.xml","r") 
        newReOld.each do |line|
            file.puts line
        end
        newReOld.close
        file.close
       
    end
   
    #修改new为old元素
    def oldReplaceNew(str)
        file = File.open(str,"r")
        newReOld = File.new("temp/newReOld.xml","w") 
        file.each do |line|
            # file2.puts line
            if line =~ /<serviceProperty_new>/
                line.replace('    <serviceProperty_old>')
                newReOld.puts line
            elsif line =~ /<\/serviceProperty_new>/
                line.replace('    </serviceProperty_old>')
                newReOld.puts line
            else
                newReOld.puts line
            end
        end
        newReOld.close
        file.close
       
        file = File.open(str,"w")
        newReOld = File.new("temp/newReOld.xml","r") 
        newReOld.each do |line|
            file.puts line
        end
        newReOld.close
        file.close
    end
   
    #插入new元素或者old元素、添加元素
    def insertNew(str)
    filedoc = File.open(str,"r") 
    docIn = Document.new(filedoc) 
    rootIn = docIn.root

    file = File.open(str,"r")
   
   
    insertNew = File.open("temp/insertNew.xml","w")
    middleNew = nil #这个一个变量很重要,因为要设其为全局变量
    middle = false
   
    file.each do |line|
        insertNew.puts line
   
        if line =~ /<\/serviceProperty_old>/ && rootIn.elements["serviceProperty_new"] == nil
            middle = false
            middleNew.close
            middleNew = File.open("temp/middleNew.xml","r")
        end
        if line =~ /<\/serviceProperty_new>/ && rootIn.elements["serviceProperty_old"] == nil
            middle = false
            middleNew.close
            middleNew = File.open("temp/middleNew.xml","r")
        end
       
        if(middle==true)
            # puts "write middlefile"
            middleNew.puts line
        end
           
        if line =~ /<serviceProperty_old>/ && rootIn.elements["serviceProperty_new"] == nil
            middleNew = File.open("temp/middleNew.xml","w")
            middle = true
            # puts "set middleNew write"
        end
        if line =~ /<serviceProperty_new>/ && rootIn.elements["serviceProperty_old"] == nil
            middleNew = File.open("temp/middleNew.xml","w")
            middle = true
        end

        if rootIn.elements["serviceProperty_new"] == nil && line =~ /<\/serviceProperty_old>/
            insertNew.puts "    <serviceProperty_new>"
            middleNew.each do |linem|
                insertNew.puts linem
            end
            insertNew.puts "    </serviceProperty_new>"
            middleNew.close
        end
       
        if rootIn.elements["serviceProperty_old"] == nil && line =~ /<\/serviceProperty_new>/
            insertNew.puts "    <serviceProperty_old>"
            middleNew.each do |linem|
                insertNew.puts linem
            end
            insertNew.puts "    </serviceProperty_old>"
            middleNew.close
        end
       
    end#for each
    file.close
    filedoc.close
    insertNew.close
   
    file = File.open(str,"w") 
    insertNew = File.open("temp/insertNew.xml","r")
    insertNew.each do |line|
        file.puts line
    end
    file.close
    insertNew.close
    end#def end
   
    def modify(filename,order_no,serv_type,home_gateway_flag)
        file = File.open(filename,"r")
        doc = Document.new(file) 
        modifyFile = File.open("temp/modifyFile.xml","w")
        root = doc.root     
        root.elements["order_no"].text = order_no
        root.elements["serv_type"].text = serv_type
        if root.elements["serviceProperty_old"] != nil
            root.elements["serviceProperty_old"].elements["home_gateway_flag"].text = home_gateway_flag
            # puts "old"
        end
        if root.elements["serviceProperty_new"] != nil
            root.elements["serviceProperty_new"].elements["home_gateway_flag"].text = home_gateway_flag
            # puts "new"
        end
        modifyFile.puts doc.to_s
        file.close
        modifyFile.close
       
        file = File.open(filename,"w") 
        modifyFile = File.open("temp/modifyFile.xml","r")
        modifyFile.each do |line|
            file.puts line
        end
        file.close
        modifyFile.close
    end#end def
results.rb
def getResults(order_no)
   
    # 创建当日文件夹和写入结果文件
    t_result = Time.now
    file_today_re = t_result.strftime("%m%d")
   
    if (File.directory?'results/'+file_today_re) == false
        Dir.mkdir("results/"+file_today_re)
    end
   
    file_log = File.open("log/"+file_today_re+"/JNEP_PRO3.diag")
    # 初始化所有文件
    file_w = File.new("results/"+file_today_re+"/addsq.txt","w")
    file_w.close
    file_w = File.new("results/"+file_today_re+"/addjq.txt","w")
    file_w.close
    file_w = File.new("results/"+file_today_re+"/addvosq.txt","w")
    file_w.close
    file_w = File.new("results/"+file_today_re+"/addvojq.txt","w")
   
   
    banner_pre = "@wanglong"
    write_f = false
   
    file_log.each do |lineLog|
        if lineLog =~ /WO_ID =/
            banner_a = /_[A-Z]+[0-9]/.match(lineLog)
            banner_b = /[A-Z]+[0-9]/.match(banner_a.to_s)
            banner_c = /[A-Z]+/.match(banner_b.to_s).to_s + "/" + /[0-9]/.match(banner_b.to_s).to_s
           
            filename_a = /#{order_no}[a-z]+_/.match(lineLog)#这个匹配是关键
            # filename_a = /[0-9]+[a-z]+_/.match(lineLog)#这个匹配是关键
            filename_b = /[a-z]+/.match(filename_a.to_s) #如果filename_b和banner_b同时为空说明这个WO_ID不是目标ID
            filename_c = "results/"+file_today_re+"/" +filename_b.to_s + ".txt"
           
            if filename_b != nil && banner_b != nil
                write_f = true
                file_w.close
                filename = filename_c
                file_w = File.new(filename,"a")
                if banner_pre != banner_c
                    file_w.puts banner_c
                    banner_pre = banner_c
                end
            end
            if filename_b == nil || banner_b == nil
                write_f = false
            end
            # puts lineLog
            # puts filename_b
            # puts banner_b
        end
        if lineLog =~ /HWSTPonProvBase:mml:/
            if write_f == true
                log_mml = /HWSTPonProvBase:mml:/.match(lineLog)
                file_w.puts $'
            end
        end
    end
end #def end


相关推荐

  • 开发测试自动化脚本以及自动化框架

    在进行测试自动化项目顾问工作的早期阶段,经常有人请我对于自动化的实现进行评估。而当我给出一个初步的估算时,很快就会遇到下一个问题:“这个估算所针对的是一个测试套件还是框架呢?”这种问题经常会让我感到难以回答,因为我不清楚他们问的到底是什么…

  • 软件测试自动化的现状分析和自动化引入条件(转载)

    软件测试自动化,已经成为国内软件工程领域一个众所周知的课题;不言而喻,软件测试从业者都意识到软件测试这项工作走向成熟化、标准化的一个必经之路就是要实施自动化测试。也许您认为实施自动化测试不是必须,也许您认为测试的思想是开展该工作的精髓、而工

  • NET软件测试自动化之道-API测试

    今天在51testing看了API测试的系列文章(http://om/html/97/n-149097.html),当前给出了6部分,都看过了。这个API测试是从《.NET软件测试自动化之道》里面摘抄下来的,对比原书,这6部分也差不多是原书

  • 泰克发布DisplayPort发射机测试自动化方案

      泰克宣布推出为早期DisplayPort开发者使用的软件,全面实现和自动执行DisplayPort物理层发射机一致性测试规范中指定的测试。该软件增加了为自动执行而预先定义的测试设置,缩短了测试时间,最大限度地减少了用户干预。新的DPO-

  • 泰克发布DisplayPort发射机测试自动化方案

    泰克宣布推出为早期DisplayPort开发者使用的软件,全面实现和自动执行DisplayPort物理层发射机一致性测试规范中指定的测试。该软件增加了为自动执行而预先定义的测试设置,缩短了测试时间,最大限度地减少了用户干预。新的DPO-DI

  • Web Application的功能测试自动化工具

    人幻想中的功效测试化东西应当知足以下基础前提:简双。测试原本便够复纯了。测试己员原来便当把精神会合在发明体系差错上里。再让测试人员正在测试步伐上破费大力量,其实得失相当。所谓简略,要害正在于和阅读器用户的操纵同轨。步伐代码应当完整屏蔽和用户

  • html网页/脚本测试网页

    http://www.w3school.com.cn/tiy/t.asp

  • 软件测试自动化

    移动应用生态系统让Android和iOS在这里是令人难以置信的动力,但他们也遭受着软件和硬件的碎片。Android尤其如此,但在iOS生态系统也存在着碎片化,随着iOS8的推出经历。作为最新版本的iOS发布,许多现有的应用程序进行了更新设备

  • Linux创建脚本时F4自动添加文本信息

    #vi~/.bashrc添加以下信息aliasvi='vim'#vi/etc/vimrc添加以下信息:mapms:callAddAuthor()'sfunctionAddAuthor()letn=1whilen<10letline=g

  • 性能测试培训:批量执行Jmeter脚本之ant调用 1

    性能测试培训:批量执行Jmeter脚本之ant调用poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。在poptest的loadrunner的培训中,为了提高学员性能优化的经

  • 移动应用自动化功能测试平台 SilkMobile 预览版

    支持安卓,ios,黑莓,塞班,windowsphone等主流的移动平台下载地址

  • 性能测试培训:批量执行Jmeter脚本之ant调用 2

    三、build.xml代码:       out="${jmeter.result.htmlName}"style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"/&g

  • 【转】简介18种开源或免费的Web应用、性能测试工具 , web功能测试工具 , web自动化测试

    18种工具名称阅览:360EasyTester、Selenium、Watir、JMeter、Grinder、Multi-Mechanize、Mechanize、Zope.testbrowser、Capybara、OpenSTA、Pylot、

  • 测试针床 测试架 治具 测试工装夹具

    http://weibo.com/i/hrhtest北京合锐和测试技术有限公司是专业设计、生产SMT周边非标自动化设备,老化架、针床、测试工装、测试治具、测试架、过锡炉治具、BGA测试座、隔音箱、ICT在线测试仪、AOI光学测试仪的厂家,北

  • 软件测试技术大全——测试基础 流行工具 项目实践

    1、软件测试行业现状?正蓬勃发展,起步晚,对测试资源的投入、测试人员的培训、测试工具的购买相对缺乏。2、目前测试人员的能力?普遍偏低,尤其是在测试用例的设计能力、测试的规范化执行、自动化测试和性能测试等方面。3、软件测试发展过程?最早开发人

  • 测试思想-测试流程 测试流程简述

    测试流程简述by:授客QQ:1033553122测试过程(以下左图)与测试阶段(或类型)(以下右图)图-1说明:1.以上左图描述的通用软件测试过程。右图描述的是具体的测试活动阶段,按不同的测试阶段分可分单元测试、集成测试、确认测试、系统测试

  • 北京测试针床 老化架 治具

    北京合锐和测试技术有限公司是专业设计、生产SMT周边非标自动化设备,老化架、针床、测试工装、测试治具、测试架、过锡炉治具、BGA测试座、隔音箱、ICT在线测试仪、AOI光学测试仪的厂家,北京实体工厂,厂房面积500平方米,各种数控加工设备齐

  • 系统测试:system testing

    9月12日晴系统测试的计划阶段最早开始,最晚执行,是一个严重“脱节”的测试阶段。但我认为这恰恰保证了系统测试的质量:评估一个软件产品首先要知道它的框架,从总体上认识了软件结构之后就开始安排测试过程、测试方案,例如是否安排预测试,采用什么测试

  • #测试沙龙# 51Testing第82期软件测试沙龙(成都站)报名倒计时!

      沙龙主题:移动互联与信息时代精神  主讲嘉宾:肖敏、嵇明  主讲嘉宾介绍:  肖敏--7年以上手机软件测试经验,3年测试团队及测试任务管理经验,服务过SONY,诺基亚,中兴等知名厂商的测试项目。熟悉手机软件系统测试,外场测试,应用测试及

  • 测试思想-测试设计 史上最详细测试用例设计实践总结 Part2

    史上最详细测试用例设计实践总结by:授客QQ:1033553122-------------------------接Part1--------------------------方法:这里针对业务流程的测试推荐使用“场景法”。(当然,个人

返回
顶部