美文网首页python接口自动化测试
python接口自动化测试实战 ( 第七章)

python接口自动化测试实战 ( 第七章)

作者: 6780441d2bcc | 来源:发表于2019-07-02 23:52 被阅读36次

    如果你不太明白这篇文章是做什么的,点击下方进入介绍篇:

    点击跳转到介绍篇,你可以知道自己能收获什么,和将要做的功能点和是否值得学习,别再迷茫了,不日进,则日退,学习才是你应该做的事情。

    进入介绍篇了解你将要走的路:python接口自动化测试(第一章)

    开始改变人生之旅,不在被开发嫌弃,不在害怕面试没有亮点,没有竞争力。

    前期的工作,做的已经差不多ok,咱们开始进行搭建运行项目之旅

    • 1.增加Junit.py文件(生成xml测试报告,用于展示allure测试报告)
    • 2.增加testcase.py文件(执行测试用例,记录请求过程)
    • 3.增加autotest.py文件(执行用例,生成Excel测试报告和发送邮件)
    • 4.增加httpstart.py文件(启动测试的文件)
    image
    image

    Junit.py 代码如下

    import timeit
    from xml.dom.minidom import Document
    from pathlib import Path
    from control.data import gettime
    from datetime import datetime
    from control.log import logger
    
    class Junit:
        def __init__(self, pstarttime):
            # 创建DOM文档对象
            self.doc = Document()
            self.pstarttime = pstarttime
            # 创建用例套件集
            self.testsuites = self.doc.createElement('testsuites')
            self.doc.appendChild(self.testsuites)
            # 报告数据
            self.nowtime = gettime()
            # 创建用例套件
            self.testsuite = self.doc.createElement('testsuite')
    
        def suite(self, error, failures, tests, skips):
            self.testsuite.setAttribute('errors', str(error))
            self.testsuite.setAttribute('failures', str(failures))
            self.testsuite.setAttribute('hostname', 'seautotest')
            self.testsuite.setAttribute('tests', str(tests))
            self.testsuite.setAttribute('skipped', str(skips))
            self.testsuite.setAttribute('name', 'API')
            self.testsuite.setAttribute('timestamp', str(datetime.isoformat(self.pstarttime)))
    
        def case(self, id, title, time):
            self.testcase = self.doc.createElement('testcase')
            self.testcase.setAttribute('classname', str(id))
            self.testcase.setAttribute('name', str(title))
            self.case_timer = time
    
        def skip_case(self, message):
            skip = self.doc.createElement('skipped')
            skip.setAttribute('message', message)
            self.testsuite.appendChild(skip)
    
        def settime(self):
            # logger.info(self.time)
            endtime = datetime.now()
            # 单个用例的执行时间
            td = endtime - self.case_timer
            time = float(
                (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6)) / 10 ** 6
            self.testcase.setAttribute('time', str(time))
            self.testcase.setAttribute('priority', 'M')
            self.testsuite.appendChild(self.testcase)
    
        def failure(self, message):
            failure = self.doc.createElement('failure')
            failure.setAttribute('message', str(message))
            failure.setAttribute('type', 'Failure')
            self.testcase.appendChild(failure)
    
        def write_toxml(self):
            td = datetime.now() - self.pstarttime
            td_time = float(
                (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6)) / 10 ** 6
            self.testsuite.setAttribute('time', '%s' % td_time)
            self.testsuites.appendChild(self.testsuite)
            file = Path('junit') / ('API' + '-' + 'ReportJunit@' + self.nowtime + '.xml')
            f = open(file, 'w')
            self.doc.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='gbk')
            f.close()
    
    

    testcase.py 代码如下

    # -*- coding: UTF-8 -*- 
    """
    1.执行用例
    2.分辨是接口自动化还是ui数据等
    3.记录测试结果和输出测试报告
    """
    from control.log import logger
    from pathlib import Path
    from control.utils import Excel, element_tojson
    from control.data import replace
    from control import httpcaps
    
    
    class TestCase:
        def __init__(self, testcase, junit):
            # 用例的总长度
            self.junit = junit
            # 当前执行的用例
            self.testcase = testcase
            # 元素和链接的书
            # 元素和链接的表格
            self.file_element = str(Path('element') / ('elements.xlsx'))
            # self.file_element = str(Path('element') / ('1911port-elements.xlsx'))
            # 读取链接和元素表格全部内容
            self.excel_element = Excel('r', self.file_element)
            # 获得数据
            self.element_data = self.excel_element.red()
            # 元素和接口转换为json,切片是为了去除表格的第一行
            self.elements = element_tojson(self.element_data[1:])
            # 配置参数可能包含ui的基本信息 是什么浏览器和App的版本信息等
            # self.parmars = parmars
            # 类型,是接口测试还是ui自动化
            # self.genre = self.parmars['genre']
            # 处理当前testcase
            # 记录执行的步骤结果
    
            # feature定义功能
            # 记录多少用例没有通过
            self.step_fail = 0
            # 记录出错的用例
            self.step_error = 0
            # 出错用例的功能点
            self.errors_detail = ''
    
        #  执行测试用例
    
        def run(self):
            steps = []
            for index, step in enumerate(self.testcase['steps']):
                try:
                    #  获得当前需要测试的接口内容
                    url = self.elements['baseurl']['url'] + self.elements[step['element']]['url']
                    # 当前接口请求的类型
                    sort = self.elements[step['element']]['type']
                    # 放入到step里面
                    step['element'] = url.strip()
                    # 查看上个测试数据里面有没有这个内容
                    # 如果里面有#号,则吧测试数据重组
                    # 将测试数据进行重组,调用自定义函数 计算出结果
                    if step['data']:
                        step['data'] = replace(str(step['data']))
                    result_json = getattr(httpcaps, 'htpp_requests')(step, self.junit, sort)
                    if result_json['score'] != 'Pass':
                        self.step_fail += 1
                    # 执行用例
                    steps.append(result_json)
                except Exception as excepetion:
                    # 将此用例等于不通过
                    step['score'] = 'Fail'
                    step['_resultinfo'] = 'exception:%s' % excepetion
                    self.step_error += 1
                    logger.info(step)
                    self.junit.failure(
                        'testdot:' + step['testdot'] + ' - ' + 'step:' + step['no'] + ' - ' + 'element:' + step[
                            'element'] + ' - ' + 'error:%s' % excepetion)
    
                    self.errors_detail += step['testdot'] + '--' + '{}'.format(excepetion)
                    steps.append(step)
                    logger.error('error:interface and element not found%s' % excepetion)
                    logger.error('error:%s' % excepetion)
            #       参数1:出错的步骤数,参数2:未通过的步骤,参数3:用例总数,参数4:跳过的用例 用例总数-去执行的数
            self.junit.suite(self.step_error, self.step_fail, len(self.testcase), '')
            self.junit.settime()
            # 记录生成的测试结果,生成测试报告excel版本
            self.testcase['steps'] = steps
            return self.testcase
    
    

    autotest.py 代码如下

    1.记得配置下邮箱账号和密码
    2.记得配置下邮箱账号和密码
    3.记得配置下邮箱账号和密码

    from datetime import datetime
    from pathlib import Path
    from control.testcase import TestCase
    from control.utils import Excel, datatodict, suite_format, mkdir
    from control.log import logger
    from control.data import testsuite2data
    from email.mime.application import MIMEApplication
    from pathlib import Path
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from control.junit import Junit
    import threading
    
    
    class Autotest():
        def __init__(self, parmars):
    
            self.parmars = parmars
            # logger.info(parmars)
            # 用例表 强转为str类型 兼容jenkins运行
            self.file_testcae = str(Path('testcase') / ('testcase.xlsx'))
            # 读取测试用例
            self.excel_testcase = Excel('r', self.file_testcae)
            # 获得用例的全部内容
            self.data = self.excel_testcase.red()
            # 转换格式为json
            self.data = datatodict(self.data)
            # 转换数据格式为测试套件返回的可执行用例json
            self.testsuit = suite_format(self.data)
            # 用于接受用例的结果
            self.result_testuite = []
            # 测试报告详细数据
            self.report_data = {}
            report_file = str(Path('report') / ('api' + '-' + 'report' + '' + '.xlsx'))
            self.report_workbook = Excel('w', report_file)
            # 生成junit测试报告
            self.junit_report = str(Path('junit') / ('api' + '-' + 'junit' + '' + '.xml'))
            # 以下为邮件配置
            self.report = str(Path('report') / ('api-report.xlsx'))
    
            self.send_user = '1'  # 发件人
            self.password = ''  # 授权码/密码
            self.receive_users = '@'  # 收件人,可为list
            self.subject = 'python自动化测试报告'  # 邮件主题
            self.email_text = 'hi hello this report '  # 邮件正文
            self.server_address = 'smtp.exmail.qq.com'  # 服务器地址
            self.mail_type = '1'  # 邮件类型
            # 程序开始时间
            self.start_se_time = datetime.now()
            self.junit = Junit(self.start_se_time)
            # 失败的用例
            self.step_fail = 0
            # 出错的用例
            self.step_error = 0
            # 当前时间
            self.start = datetime.now()
            # 创建文件
            files = ('report', 'junit', 'config')
            for file in files:
                mkdir(file)
    
            txt_path = str(Path('config') / ('txt_final.txt'))
            txt = open(txt_path, 'w')
            txt.seek(0)
            txt.truncate()
            txt.close()
    
        def play(self):
            # 读取测试套件执行用例
            for testcae in self.testsuit:
                # 跳过的用例
                if testcae['condition'] == 'skip':
                    for skipcase in testcae['steps']:
                        logger.info(skipcase)
                        skipcase['score'] = 'skip'
                    self.result_testuite.append(testcae)
                    continue
    
                    # 传入当前用例
                rcase = TestCase(testcae, self.junit)
                # 写入xml测试报告
                self.junit.case(testcae['id'], testcae['title'], datetime.now())
                # 使用线程增加运行速度
                thread = threading.Thread(target=self.result_testuite.append(rcase.run()), name=testcae['title'])
                # logger.info(thread.name)
                thread.start()
                # self.result_testuite.append(rcase.run())
                # 收到测试的结果,进行生成测试报告
            self.junit.write_toxml()
    
        def crateport(self):
            data = testsuite2data(self.result_testuite)
            self.report_workbook.write(data, 'repost_data')
            # 写一次就关一次
            self.report_workbook.close()
    
        # 发送邮箱到测试报告
        def sedEmail(self):
            # 发送邮件之前获得测试结果
            # self.email_text = '用例总数:{},'.format(len(self.result_testuite)) + '成功条数:{}'.format() + '失败条数:{}'.format(3)
            # 构造一个邮件体:正文 附件
            msg = MIMEMultipart()
            msg['Subject'] = self.subject  # 主题
            msg['From'] = self.send_user  # 发件人
            msg['To'] = self.receive_users  # 收件人
    
            # 构建正文
            part_text = MIMEText(self.email_text)
            msg.attach(part_text)  # 把正文加到邮件体里面去
    
            # 构建邮件附件
            # file = file           #获取文件路径
            part_attach1 = MIMEApplication(open(self.report, 'rb').read())  # 打开附件
            part_attach1.add_header('Content-Disposition', 'attachment', filename='1911api-report.xlsx')  # 为附件命名
            msg.attach(part_attach1)  # 添加附件
    
            # 发送邮件 SMTP
            smtp = smtplib.SMTP(self.server_address, 25)  # 连接服务器,SMTP_SSL是安全传输
            # smtp.set_debuglevel(1)
            smtp.login(self.send_user, self.password)
            smtp.sendmail(self.send_user, self.receive_users, msg.as_string())  # 发送邮件
            logger.info('邮件发送成功~~~~~~~~~~~~')
    
    

    httpstart.py 代码如下

    from control.autotest import Autotest
    import sys
    from datetime import datetime
    import os
    start_se_time = datetime.now()
    # 将工程根目录加入到python搜索路径中
    sys.path.append('..')
    # 兼容后期格式,是接口自动化还是web自动化app自动化,数据库,小程序 h5等自动化测试,以接口为主
    desired_caps = {'genre': 'api'}
    autotest = Autotest(desired_caps)
    # 执行测试
    autotest.play()
    # 创建测试报告
    autotest.crateport()
    # 生成allure测试报告
    # 参考资料 生成xml报告形式:https://llg.cubic.org/docs/junit/
    os.system('allure serve junit')
    # 发送测试报告到邮箱
    
    end_se_time = datetime.now()
    
    print(end_se_time - start_se_time)
    
    

    接下来咱们运行httpstart.py文件

    image

    会自动启动allure测试报告,咱们看下~

    image
    image
    image

    这是Excel测试报告

    image

    有问题欢迎评论区留言,看到后会一一解答。

    接口自动化第八章,开始继续学习吧~

    源码下载地址复制地址打开,不然会没有权限:https://gitee.com/zhangmeng1314/seautotet-public.git
    感谢您的阅读,本人是希望能帮助到想进步学习的同学,大佬勿喷,我会一直维护此项目争取做的更好,我也是一个小白,希望和大家一起成长,第一次写博客文章,大家有意见感觉写的不好不清楚,评论区留言都可以的哦,我会用最简单的方式去解答您的问题,谢谢
    qq群:234922431

    相关文章

      网友评论

        本文标题:python接口自动化测试实战 ( 第七章)

        本文链接:https://www.haomeiwen.com/subject/migxhctx.html