• 简陋版:基于python的自动化测试框架开发


    项目背景:

      XXXX银行项目采用的是B/S架构,主要是为了解决银行业务中的柜员、凭证、现金、账务等来自存款、贷款、会计模块的管理。

    手工弊端:

    1.项目业务复杂度高,回归测试工作量大
    2.单个接口功能比较简单,容易实现自动化集成,且相对UI更稳定,更能达到监控项目质量的目的
    3.从前后端分离的角度说,只依赖前端限制并不能满足安全要求

    优化方案及工具选择:

    Postman:

      功能强大Chrome插件,界面好看响应格式自主选择,缺点支持的协议单一且不能数据分离,比较麻烦的还有不是所有的公司都能上谷歌
    SoupUI:

      支持多协议(httpsoup est等),能实现功能和性能测试的开源接口测试工具,灵活性高可在此基础上开发脚本,缺点上手比较难
    Jmeter:

      Java御用的接口压力测试工具,做接口功能测试有点大材小用,缺点不能生成可视化的接口测试报告

    综上:手动开发比较合适

    框架原理:

    采用数据驱动模式,将数据和业务逻辑分离,完成测试用例编写-》测试用例执行-》测试报告发送的目的

    测试用例格式编写如下:

    代码实现:

    注:为了数据脱敏,以百度翻译接口为例

    1.读取测试用例数据data.py

    # coding=utf-8
    import json
    import xlrd
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    
    def tableToJson():
        source = xlrd.open_workbook(r"C:UsersHPDesktop608InterfaceData.xlsx")
        table = source.sheet_by_index(0)
        list = []  # 字典列表
        totalList = []  # json列表
        for i in xrange(1,2):         #获取第i个表第2行起的值作为用例的参数
            keys = table.col_values(1)  # 获取第i个表第2列的值
            keys.pop(0)
            for j in xrange(3, table.ncols):
                test_value = table.col_values(j)  # 获取第i个表第4列起的值作为用例的参数值
                test_value.pop(0)
                for k in range(len(test_value)):
                    s = test_value[k]
                    # print s
                data = dict(zip(keys, test_value))  # 等长两列表转为字典
                list.append(data)
               
        data = {}
        data[table.name] = list
        list = []
        data_to_json = json.dumps(data, ensure_ascii=False, encoding="gb2312")  # 将列表中的unicode转中文
        print u"用例数据:", data_to_json
        totalList.append(data_to_json)
        
        return totalList
    
    if __name__ == '__main__':
        jsonData = tableToJson()
    
        # 写入文件
        f = open(r"F:TestData0618.json", 'w+')
        for i in jsonData:
            f.write(i)
            f.write('
    ')
        f.close()

    运行结果:

    2.执行测试用例test.py

    #coding=utf-8
    import requests
    import unittest
    import json
    
    class MyTest(unittest.TestCase):  # 封装测试环境的初始化和还原的类
        def setUp(self):
            print("start test")
    
        def tearDown(self):
            print("end test")
    
    
    class Test_transapi(MyTest):  # 一个接口封装一个类
    
        @staticmethod
        def getParams():
            Data = open(r"F:TestData0618.json").read()
            temp = eval(Data)   #type(Data)为str,type(temp)为dict
            data = temp['2100']
            return data
    
        def test_transapi(self):
            self.url = "http://fanyi.baidu.com/v2transapi"
            self.headers = {
                'Host': 'fanyi.baidu.com',
                'Upgrade-Insecure-Requests': '1',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                'Accept-Encoding': 'gzip, deflate, sdch, br',
                'Accept-Language': 'zh-CN,zh;q=0.8',
                'Cache-Control': 'max-age=0',
                'Connection': 'keep-alive'}
            data = self.getParams()
            for i in data:
                print i
                self.params = i
                #print u'参数:',self.params
                r = requests.get(url=self.url, params=self.params,headers=self.headers)
                #print (r.text)
                print (r.status_code)
                self.assertEqual(200,r.status_code)
            
            
    
    
    if __name__=="__main__":
        unittest.main()    

    运行结果:

    3.构建测试报告run.py

    #coding=utf-8
    from HTMLTestRunner import HTMLTestRunner  
    import time  
    import unittest
    
    #定义测试用例的目录为当前目录  
    test_dir = r'C:UsersHPDesktop608'  
    discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')  
      
    if __name__=="__main__":  
      
      
        #按照一定的格式获取当前的时间  
        now = time.strftime("%Y-%m-%d %H-%M-%S")  
          
        #定义报告存放路径  
        filename =test_dir + '/' + now + 'test_result.html'  
          
        fp = open(filename,"wb")  
        #定义测试报告  
        runner = HTMLTestRunner(stream =  fp,  
                                title = u"2100接口测试报告",  
                                description = u"测试用例执行情况:")  
        #运行测试  
        runner.run(discover)  
        fp.close() #关闭报告文件

    运行结果:

    4.发送测试报告send.py

    #coding=utf-8
    
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    
    def SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password):
        '''
        @subject:邮件主题
        @msg:邮件内容
        @to_addrs:收信人的邮箱地址
        @from_addr:发信人的邮箱地址
        @smtp_addr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com
        @password:发信人的邮箱密码
        '''
        mail_msg = MIMEMultipart()      #创建一个带附件实例
    
        #构造附件test.docx
        att1 = MIMEText(open(r'C:UsersHPDesktop6082017-06-18 22-33-24test_result.html','rb').read(), 'base64', 'gb2312')
        att1["Content-Type"] = 'application/octet-stream'
        att1.add_header('Content-Disposition', 'attachment', filename=u'测试报告.html'.encode('gbk')) 
        mail_msg.attach(att1)
        #构建MIMEText纯文本内容
        txt = MIMEText(msg,'plain', 'utf-8')
        mail_msg.attach(txt)
    
        mail_msg['Subject'] = subject
        mail_msg['From'] =from_addr
        mail_msg['To'] = ','.join(to_addrs)
        try:
            s = smtplib.SMTP()
            s.connect(smtp_addr)  #连接smtp服务器
            s.login(from_addr,password)  #登录邮箱
            s.sendmail(from_addr, to_addrs, mail_msg.as_string()) #发送邮件
            s.quit()
        print "success"
        except Exception,e:
           print str(e)
    
    
    if __name__ == '__main__':
        from_addr = "XXX"
        smtp_addr = "XXX"
        to_addrs = ["XXX"]
        subject = "send test"
        password = "XXX"
        msg = "hello,this is just a send test"
        SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password)

    运行结果:

    5.定时执行测试用例

     详见Jenkins安装与使用

    问题和挑战:

    1.接口文档更新不及时,导致用例数据可能与实际需要的有所出入。推荐使用SwaggerUI工具管理接口测试文档

    2.大部分用例执行之前为了安全需要保证已登录,简单的将cookie加入请求头不管用,用session

    3.测试报告用的是通用版(一个脚本一条记录),所有现状将一个接口下所有用例都写在一个脚本里只会有一条记录

    4.邮件中文附件名称乱码

  • 相关阅读:
    在Windows系统下搭建ELK日志分析平台
    ELK安装成windows服务
    ElasticSearch NEST笔记
    ElasticSearch5.0——IK词库加载
    ElasticSearch速学
    搜索引擎选择: Elasticsearch与Solr
    windows文件名太长无法删除的解决办法
    Elasticsearch(八)【NEST高级客户端--Mapping映射】
    elasticsearch 配置详解
    Elasticsearch(八)【NEST高级客户端--分析器】
  • 原文地址:https://www.cnblogs.com/Ryana/p/7027489.html
Copyright © 2020-2023  润新知