• 最完整的自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件


      转自:http://www.cnblogs.com/yufeihlf/p/5752146.html#test32

        今天笔者就要归纳总结下一整套测试流程,从无到有,实现零突破,包括如何编写测试用例,定时执行测试用例,查找最新生成的测试报告文件,自动发送最新测试报告邮件,一整套完整的测试流程。以后各位只要着重如何编写测试用例即可,其他模板可以套用的,希望帮助到大家。

    目录

    一、编写测试用例

    二、执行测试用例,查找最新测试用例,自动发送测试报告

    三、定时执行测试用例

       3.1方案一:Windows任务计划

       3.2方案二:Jenkins持续集成

    四、成果验收

    环境准备:

    操作系统:Windows7

    集成开发环境:eclipse+pydev

    一、编写测试用例

    点击返回目录

        可以直接使用Python自带的单元测试框架unittest来编写自动化测试用例,利用其组织测试用例,断言预期结果,以及批量执行测试用例等功能,可以很好的进行Web自动化测试的开发。

        可以直接查看我另外一篇博文总结:unittest单元测试框架总结

        里边详细总结了使用unittest框架编写测试用例思路(模板)使用unittest框架编写测试用例实例

        目录结构如下组织:

        如上图:test_case目录下有两个测试用例,其中test_baidu.py实例代码在博文“unittest单元测试框架总结”中有贴出。其他实例,可以参考模板实现,就不全部贴出代码了。

        而这次需要测试的就是test_baidu.py和test_youdao.py这两个测试用例。

    二、执行测试用例,查找最新测试用例,自动发送测试报告

    点击返回目录

        整个代码执行过程可以分成三个步骤:

        1.通过unittest框架的discover()找到匹配的测试用例(以test_开头的脚本),由HTMLTestRunner的run()方法执行测试用例并生成最新测试报告。HTMLTestRunner是Python标准卡unittest单元测试框架的一个扩展,主要用于生成HTML测试报告,以便生成一份通俗易懂的测试报告来展示自动化测试成果。

    HTMLTestRunner模块下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

    将下载的文件保存在C:Python27Lib目录下即可。

        2.先定义new_file()函数(找到某目录最新文件),调用new_file()函数找到测试报告目录下最新生成的测试报告,返回最新测试报告的路径。

        3.先定义send_email()函数(发送指定路径下某文件的邮件),将得到的最新测试报告的完整路径传给send_email()函数,实现发邮件功能。

        关于发邮件功能,也可以参考我另外一篇博文:Python自动发邮件总结及实例说明

        代码如下:注释中包括实现的过程说明以及一些在测试过程中遇到的问题。

        文件命名为runtest_htmltestrunner_autosendemail.py

    复制代码
    # coding=utf-8
    '''
    Created on 2016-7-26
    @author: Jennifer
    Project:整合自动发邮件功能,执行测试用例生成最新测试报告,取最新的测试报告,发送最新测试报告
    问题,邮件始终不能显示html:将电脑时间改为北京时间即可
    '''
    import unittest
    from HTMLTestRunner import HTMLTestRunner
    import time
    import os
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
    
    #2.定义:取最新测试报告
    def new_file(test_dir):
        #列举test_dir目录下的所有文件,结果以列表形式返回。
        lists=os.listdir(test_dir)
        #sort按key的关键字进行排序,lambda的入参fn为lists列表的元素,获取文件的最后修改时间
        #最后对lists元素,按文件修改时间大小从小到大排序。
        lists.sort(key=lambda fn:os.path.getmtime(test_dir+'\'+fn))
        #获取最新文件的绝对路径
        file_path=os.path.join(test_dir,lists[-1])
    #    L=file_path.split('\')
    #    file_path='\\'.join(L)
        return file_path
    
    #3.定义:发送邮件,发送最新测试报告html
    def send_email(newfile):
        #打开文件
        f=open(newfile,'rb')
        #读取文件内容
        mail_body=f.read()
    #调试使用
    #    print u'打印'
    #    print mail_body
        #关闭文件
        f.close()
        
        #发送邮箱服务器
        smtpserver = 'smtp.163.com'
        #发送邮箱用户名/密码
        user = 'XXX@163.com'
        password='XXX'
        #发送邮箱
        sender='XXX@163.com'
        #多个接收邮箱,单个收件人的话,直接是receiver='XXX@126.com'
        receiver=['XXX@126.com','XXX@126.com','XXX@doov.com.cn']
        #发送邮件主题
        subject = '自动定时发送测试报告20160808'
        
        #编写 HTML类型的邮件正文
    #MIMEText这个效果和下方用MIMEMultipart效果是一致的,已通过。
    #    msg = MIMEText(mail_body,'html','utf-8')
        
        msg=MIMEMultipart('mixed')
        
        #注意:由于msg_html在msg_plain后面,所以msg_html以附件的形式出现
    #    text = "Dear all!
    The attachment is new testreport.
    Please check it."  
        #中文测试ok
    #    text = "Dear all!
    附件是最新的测试报告。
    麻烦下载下来看,用火狐浏览器打开查看。
    请知悉,谢谢。"   
    #    msg_plain = MIMEText(text,'plain', 'utf-8')    
    #    msg.attach(msg_plain)
        
        msg_html1 = MIMEText(mail_body,'html','utf-8')
        msg.attach(msg_html1)
        
        msg_html = MIMEText(mail_body,'html','utf-8')
        msg_html["Content-Disposition"] = 'attachment; filename="TestReport.html"'
        msg.attach(msg_html)
       
        #以附件的方式发送:但是会报554,倍163退信。--此路不通。
    #    msg_html = MIMEText(mail_body,'base64','utf-8')
    #    msg_html["Content-Type"] = 'application/octet-stream'  
    #    msg_html.add_header('Content-Disposition', 'attachment', filename='testreport.html')
    #    msg.attach(msg_html)
            
    #要加上msg['From']这句话,否则会报554的错误。 
    #要在163有限设置授权码(即客户端的密码),否则会报535
        msg['From'] = 'XXX@163.com <XXX@163.com>'
    #    msg['To'] = 'XXX@doov.com.cn'
        #多个收件人
        msg['To'] = ";".join(receiver)
        msg['Subject']=Header(subject,'utf-8')
    
        #连接发送邮件
        smtp=smtplib.SMTP()
        smtp.connect(smtpserver,25)
        smtp.login(user, password)
        smtp.sendmail(sender, receiver, msg.as_string())
        smtp.quit()
    
    if __name__=='__main__':   
        print '=====AutoTest Start======'
        #1.执行测试用例,生成最新的测试用例
        #指定测试用例为当前文件夹下的test_case目录
        #如果用/可以不用r
    #    test_dir='./test_case'
    #Windows的cmd执行:python "D:system filesworkspaceselenium	est_project
    untest_htmltestrunner_autosendemail.py"
    #不用绝对路径会报:ImportError: Start directory is not importable: './test_case'
        test_dir = 'D:\system files\workspace\selenium\test_project\test_case'
        #知道测试报告的路径
        test_report_dir='D:\pythontest\testresult'
        
        discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
        now=time.strftime('%Y-%m-%d_%H_%M_%S_')
        filename = test_report_dir+'\'+ now + 'result.html'
        fp=open(filename ,'wb')
    #需屏蔽fp中的中文文字说明。否则在windows下执行会报:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 553: ordinal not in range(128)
        runner = HTMLTestRunner(stream=fp,title=u'测试报告',description=u'用例执行情况:')
        runner.run(discover)
    #注意:调用函数一定要加括号,一个括号害死个人,哎,查了几天的问题,才发现导致html文件始终显示空白,就是因为close函数调用不正确,漏了括号。
        fp.close() 
        
        #2.取最新测试报告
        new_report=new_file(test_report_dir)
    #调试用的
    #    print new_report
        
        #3.发送邮件,发送最新测试报告html
        send_email(new_report)
        print '=====AutoTest Over======'
        
    复制代码

        直接在eclipse运行,运行结果如下:

        ..表示两个测试用例都执行通过。

     

    三、定时执行测试用例

    点击返回目录

    方案一:直接使用Windows任务计划执行Python测试脚本。

    1.创建runner.bat

        由于runtest_htmltestrunner_autosendemail.py脚本目录为D:system filesworkspaceselenium est_project,

        所以在该目录下创建runner.bat,runner.bat的内容如下:

        python runtest_htmltestrunner_autosendemail.py

        建议:可以事先在cmd命令行下执行runtest_htmltestrunner_autosendemail.py,确保该脚本能够在Windows下正常运行。如不能正常运行,请继续调试,找出问题,直到能够正常运行。如下:

    2.创建任务计划

    2.1右键计算机,点击管理,点击任务计划程序,再点击右方的创建任务。

    2.2常规中,填写名称,如:定时执行Python脚本

        触发器中,指定执行脚本时间。

        最重要的是操作设置:

        程序和脚本填写runner.bat这个文件的名称

        起始于填写runner.bat所在路径,D:system filesworkspaceselenium est_project

        如下:

    3.查看

        在任务计划程序库中,就会出现该任务。

    方案二:使用Jenkins定时执行脚本

        Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,所以可用于定时执行python脚本。

    环境准备:jdk1.7及以上+Jenkins[+tomcat(可选)]

        Jenkins的安装可以通过tomcat作为容器安装,由于Jenkins包就自带了servlet,所以我们只需要下载安装就可以直接启动。 

        jenkins下载地址:http://jenkins-ci.org   选择LTS(长期支持的版本),比较稳定,下载war包。
    第一种启动方法,切换到jenkins.war存放的目录(随便哪个目录),输入如下命令:
    > java -jar jenkins.war   #这样的话默认端口是8080
    若要指定端口,则:
    >java -jar jenkins.war --httpPort=8080
    然后在浏览器中(推荐用火狐)输入localhost:8080,localhost可以是本机的ip,也可以是计算机名。就可以打开jenkins.
     
    我就是用第一种方法安装Jenkins。
     
    第二种方法是用tomcat打开
    tomcat下载地址:http://tomcat.apache.org/
    解压tomcat到某个目录,如D: omcat9,进入tomcat下的/bin目录,启动tomcat:即双击startup.bat文件
    将jenkins.war文件放入tomcat下的webapps目录下,启动jenkins时,会自动在webapps目录下建立jenkins目录,所以在地址栏上需要输入的地址于上一种方法有点不一样。
     
    项目配置
    点击左方的“新建”。

    下方为配置说明:

    说明:日程表依次是 分钟 小时 日 月 星期

    *:表示每,每分钟,每小时,每天,每月,每星期等

    , :表示指定列表范围。

    - :表示区间范围 

    所以0 1 * *  1-5 表示 每个月的星期一到星期五,凌晨一点定时执行脚本。

    说明:执行脚本的命令。

    上面配置完成后点击保存即可。

    立即构建

    可先手动构建项目,查看项目是否能够执行通过。

    点击左方的“立即构建”

     构建完成后,Build History就会有一条记录。

     

    点击这条历史记录进去

    再点击Console Output,可查看到日志,Finished: SUCCESS,说明已成功。

     

    四、成果验收

    点击返回目录

        然后只需要静静的等待,测试报告邮件的到来。

        在此需要感谢虫师编著的“selenium2 自动化测试实战 基于Python语言”。

    (尊重笔者的劳动哦,转载请说明出处哦。)

  • 相关阅读:
    Spring MVC全局异常后返回JSON异常数据
    spring mvc 异常统一处理方式
    Duplicate fragment name ERROR Jetty Maven Plugin
    Android中自己定义组件和它的属性
    stl非变易算法(二)
    unix more命令
    g711u与g729比較编码格式
    MD5的加密和解密(总结)
    js 定义类对象
    润乾报表实现可反复分组报表及改进
  • 原文地址:https://www.cnblogs.com/daxiong2014/p/6571648.html
Copyright © 2020-2023  润新知