国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于Python 簡易實現(xiàn)接口測試自動化

這篇具有很好參考價值的文章主要介紹了基于Python 簡易實現(xiàn)接口測試自動化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

實現(xiàn)思路

統(tǒng)籌腳本

請求封裝?

日志封裝

結(jié)果比對

結(jié)果郵件

用例獲取及數(shù)據(jù)格式化

請求url轉(zhuǎn)換

測試用例excel結(jié)構(gòu)

測試報告

郵件接收結(jié)果

資料獲取方法


實現(xiàn)思路

使用excel管理用例用例信息,requests模塊發(fā)送http請求,實現(xiàn)了記錄日志,郵件發(fā)送測試報告的功能

目錄結(jié)構(gòu)如下:

基于Python 簡易實現(xiàn)接口測試自動化,自動化測試,軟件測試,自動化,軟件測試工程師,程序人生,軟件測試,自動化測試,接口自動化測試

下面直接上代碼:

統(tǒng)籌腳本

請求封裝?

# coding:utf-8
import json
import requests
 
from logging_save import logger
from result_check import Result_check
from url_transform import urltransform
 
 
class Interface:
    def __init__(self, ):
        pass
 
    def interfaceTest(self, case_list):
        """
        接口調(diào)用主函數(shù)
        """
        # 用于存結(jié)果
        res_flags = []
        # 用于存請求報文
        request_urls = []
        # 用于存返回報文
        responses = []
        # 用戶存失敗的用例
        failed_case = []
        # 統(tǒng)計成功失敗的用例數(shù)
        count_success = 0
        count_failure = 0
        for case in case_list:
            try:
                # 模塊
                product = case[0]
                # 用例id
                case_id = case[1]
                # 用例標(biāo)題
                interface_name = case[2].strip('\n')
                # 用例描述
                case_detail = case[3]
                # 請求方式
                method = case[4]
                # 請求url
                url = case[5]
                # 入?yún)?                param = case[6]
                # 預(yù)期結(jié)果
                res_check = case[7]
            except Exception as e:
                return '測試用例格式不正確!%s' % e
            # 定義消息頭信息
            headers = {'content-type': 'application/json',
                       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
            # 對url進行封裝
            new_url = urltransform().urltransform(url, method, param)
            if method.upper() == 'GET':
                results = requests.get(new_url).text
                logger.info(u'正在調(diào)用接口: %s' % interface_name)
                # print results
                responses.append(results)
                # 用于存儲預(yù)期結(jié)果與實際結(jié)果的比較結(jié)果
                res = Result_check().interface_result_check(results, res_check)
                request_urls.append(new_url)
            else:
                request_urls.append(new_url)
                if param == '':
                    pass
                else:
                    data = json.loads(param)  # 將參數(shù)轉(zhuǎn)化為json格式
                results = requests.post(new_url, data=json.dumps(data), headers=headers).text
                responses.append(results)
                res = Result_check().interface_result_check(results, res_check)
            if 'pass' in res:
                res_flags.append('pass')
                count_success += 1
            else:
                logger.warning(u'接口返回結(jié)果與預(yù)期結(jié)果不一致!失敗URL: %s METHOD :%s' % (url, method))
                res_flags.append('fail')
                count_failure += 1
                failed_case.append((interface_name, method, url))
        logger.info(u'共執(zhí)行 %s 條用例,PASS: %s,FAILED: %s' % (len(case_list), count_success, count_failure))
        return res_flags, request_urls, responses, count_success, count_failure, failed_case

日志封裝

# coding=utf-8
import logging
import sys
import traceback
import time
 
class LoggingUtils:
    '''
    ===========封裝日志工具類的基本操作=============
    '''
    def __init__(self,logfile):
        '''
        :param logfile:
        '''
        self.logger = logging.getLogger(logfile)
        self.hdlr = logging.FileHandler(logfile)
        formatter = logging.Formatter('%(asctime)s %(levelname)s - %(message)s')
        self.ch = logging.StreamHandler()
        self.ch.setLevel(logging.INFO)
        self.ch.setFormatter(formatter)
        self.hdlr.setFormatter(formatter)
        self.logger.addHandler(self.hdlr)
        self.logger.addHandler(self.ch)
        self.logger.setLevel(logging.DEBUG)
 
    def debug(self, msg):
        '''
        :param msg:
        :return:
        '''
        self.logger.debug(msg)
        self.hdlr.flush()
 
    def info(self, msg):
        '''
         
        :param msg:
        :return:
        '''
        self.logger.info(msg)
        self.hdlr.flush()
 
    def warning(self,msg):
        self.logger.warning(msg)
        self.hdlr.flush()
 
    def error(self, msg):
        '''
 
        :param msg:
        :return:
        '''
        self.logger.error(msg)
        # self.logger.removeHandler(logging.StreamHandler())
        self.logger.removeHandler(self.ch)
        self.hdlr.flush()
 
    def error_sys(self, limit=None):
        '''
        :param limit:
        :return:
        '''
        exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
        if limit is None:
            if hasattr(sys, 'tracebacklimit'):
                limit = sys.tracebacklimit
        n = 0
        eline = '\n'
        while exceptionTraceback is not None and (limit is None or n < limit):
            f = exceptionTraceback.tb_frame
            lineno = exceptionTraceback.tb_lineno
            co = f.f_code
            filename = co.co_filename
            name = co.co_name
            eline += ' File "%s", line %d, in %s \n ' % (filename, lineno, name)
            exceptionTraceback = exceptionTraceback.tb_next
            n = n + 1
 
        eline += "\n".join(traceback.format_exception_only(exceptionType, exceptionValue))
        self.logger.error(eline)
        self.hdlr.flush()
timer = time.strftime('%Y-%m-%d',time.localtime())
logger = LoggingUtils('%s.log'%timer)

結(jié)果比對

#coding:utf-8
class result_check():
 
    def __init__(self):
        pass
 
    def result_check(self,results,res_check):
        '''
        結(jié)果對比函數(shù)
        '''
        #返回結(jié)果,將結(jié)果中的json數(shù)據(jù)轉(zhuǎn)化為可以和預(yù)期結(jié)果比較的數(shù)據(jù)
        res = results.replace('":"','=').replace('" : "','=')
        #預(yù)期結(jié)果,是xx=11;xx=22
        res_check = res_check.split(';')
        for s in res_check:
            if s in res:
                pass
            else:
                return '結(jié)果不匹配 '+ str(s)
        return 'pass'
 result_save.py   保存測試結(jié)果的模塊,復(fù)制原有的用例,保存為新的excel
#coding:utf-8
from xlutils import copy
import xlrd
import time
import os
 
class Save_test_result():
 
    def __init__(self):
        pass
 
    def save_result(self,file_path,res_flags,request_urls,responses):
        '''
        :return:
        '''
        book = xlrd.open_workbook(file_path)
        new_book = copy.copy(book)
        sheet = new_book.get_sheet(0)
        i = 1
        for request_url, response, flag in zip(request_urls, responses, res_flags):
            sheet.write(i, 8, u'%s' % request_url)
            sheet.write(i, 9, u'%s' % response)
            sheet.write(i, 10, u'%s' % flag)
            i += 1
        report_path = os.path.abspath(os.path.join('report'))
        if not os.path.exists(report_path):
            os.makedirs(report_path)
        new_book.save(os.path.abspath(os.path.join(report_path, 'Report@%s.xls' % time.strftime('%Y.%m.%d@%H%M%S'))))

結(jié)果郵件

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import os
from logging_save import  logger
 
 
class Send_report(object):
    def __init__(self,count_success,count_failure,failed_case):
        '''
        :param count_success:
        :param count_failure:
        :param failed_case:
        '''
        self.count_success = count_success
        self.count_failure = count_failure
        self.failed_case = failed_case
 
    def newest_report(self,testreport='report'):
        '''
        獲取最新的測試報告
        :param testreport:
        :return:
        '''
        lists = os.listdir(testreport)
        lists.sort(key=lambda fn: os.path.getmtime(os.path.join(testreport,fn)))
        file_new = os.path.join(testreport, lists[-1])
        logger.info('獲取最新附件報告成功')
        return file_new
 
    def send_result(self,username,passwd,from_addr,to_addrs,smtpserver,*args):
        '''
        :param username:
        :param passwd:
        :param from_addr:
        :param to_addrs:
        :param smtpserver:
        :param args:
        :return:
        '''
        sender = from_addr
        subject = '財富港接口測試結(jié)果'
        username = username
        passwd = passwd
 
        '''郵件內(nèi)容'''
        tille = (u'用例名稱', u'請求方式', u'url')
        details = (u'成功: ' + str(self.count_success) + u'失敗: ' + str(self.count_failure)) + '\n' + u'失敗的用例如下 :' + \
                  '\n' + '\n'.join(str(zip(tille, i)) for i in self.failed_case).decode('unicode-escape')
        logger.info('郵件附件為: %s' %(args[0].split('\\')[1]))
 
        if args != None: #判斷是否添加附件
            msg = MIMEMultipart()
            msg.attach(MIMEText(details, 'plain', 'utf-8'))
            i = 0
            while i < len(args): #可以添加多個附件
                part = MIMEText(open(args[i], 'rb').read(), 'base64', 'utf-8')
                part["Content-Type"] = 'application/octet-stream'
                part["Content-Disposition"] = 'attachment; filename="%s"'%args[i]
                msg.attach(part) #添加附件
                i += 1
 
            msg['subject'] = Header(subject, 'utf-8')
            msg['From'] = from_addr
            msg['To'] = ','.join(eval(to_addrs)) #兼容多個收件人
            smtp = smtplib.SMTP()
            try:
                smtp.connect(smtpserver)
                smtp.login(username, passwd)
                smtp.sendmail(sender, eval(to_addrs), msg.as_string())
                smtp.close()
                logger.info('帶附件測試報告發(fā)送成功!')
            except smtplib.SMTPAuthenticationError,e:
                logger.error('郵箱賬戶或密碼錯誤: '+ str(e))
 
        else:
            msg = MIMEText(details, 'plain', 'utf-8')
            msg['subject'] = Header(subject, 'utf-8')
            msg['From'] = from_addr
            msg['To'] =  ','.join(eval(to_addrs))
            smtp = smtplib.SMTP()
            try:
                smtp.connect(smtpserver)
                smtp.login(username, passwd)
                smtp.sendmail(sender, eval(to_addrs), msg.as_string())
                logger.info('測試報告發(fā)送成功!')
                smtp.close()
            except smtplib.SMTPAuthenticationError,e:
                logger.error('郵箱賬戶或密碼錯誤 : '+str(e))

用例獲取及數(shù)據(jù)格式化

#coding:utf-8
import xlrd
 
from logging_save import logger
 
class Get_testcase(object):
 
    def __init__(self, file_path):
        '''
        :param file_path: 用例文件路徑
        '''
        self.file_path = file_path
 
    def readExcel(self):
        '''
        讀取用例函數(shù)
        :return: 測試用例列表
        '''
        try:
            book = xlrd.open_workbook(self.file_path)  # 打開excel
        except Exception, error:
            logger.error('路徑不在或者excel不正確 : ' + str(error))
            return error
        else:
            sheet = book.sheet_by_index(0)  # 取第一個sheet頁
            rows = sheet.nrows  # 取這個sheet頁的所有行數(shù)
            case_list = []  # 用于保存用例信息
            for i in range(rows):
                if i != 0:
                    case_list.append(sheet.row_values(i)) # 把每一條測試用例添加到case_list中
            return case_list

請求url轉(zhuǎn)換
#coding:utf-8
class urltransform(object):
    def __init__(self):
        pass
 
    def urltransform(self, url, method, param):
        '''
        :return:
        '''
        if param == '':
            new_url = url
        else:
            if method.upper() == 'GET':
                new_url = url + '?' + param.replace(';', '&')  #如果有參數(shù),且為GET方法則組裝url
            else:
                new_url = url
        return new_url
測試用例excel結(jié)構(gòu)

基于Python 簡易實現(xiàn)接口測試自動化,自動化測試,軟件測試,自動化,軟件測試工程師,程序人生,軟件測試,自動化測試,接口自動化測試

config目錄下,config.py?? 獲取配置文件信息的模塊

#conding:utf-8
import ConfigParser
 
class Config(object):
 
    def __init__(self,file_path):
        self.config = ConfigParser.ConfigParser()
        self.config.read(file_path)
 
    def get_mail_config(self):
        login_user = self.config.get('SMTP', 'login_user')
        login_pwd = self.config.get('SMTP', 'login_pwd')
        from_addr = self.config.get('SMTP', 'from_addr')
        to_addrs = self.config.get('SMTP', 'to_addrs')
        smtp_server = self.config.get('SMTP', 'smtp_server')
        port = self.config.get('SMTP', 'port')
        return login_user, login_pwd , from_addr, to_addrs,smtp_server, port
 
    def report_save_config(self):
        pass

mail.conf

[SMTP]
login_user = 18******@163.com
login_pwd = ******
from_addr =  BI<18******@163.com>
to_addrs = ['18******@163.com']
#to_addrs = ['1******@qq.com','******.com']
smtp_server = smtp.163.com
port = 25

測試報告

基于Python 簡易實現(xiàn)接口測試自動化,自動化測試,軟件測試,自動化,軟件測試工程師,程序人生,軟件測試,自動化測試,接口自動化測試

郵件接收結(jié)果

基于Python 簡易實現(xiàn)接口測試自動化,自動化測試,軟件測試,自動化,軟件測試工程師,程序人生,軟件測試,自動化測試,接口自動化測試


資料獲取方法

【留言777】

基于Python 簡易實現(xiàn)接口測試自動化,自動化測試,軟件測試,自動化,軟件測試工程師,程序人生,軟件測試,自動化測試,接口自動化測試

基于Python 簡易實現(xiàn)接口測試自動化,自動化測試,軟件測試,自動化,軟件測試工程師,程序人生,軟件測試,自動化測試,接口自動化測試

各位想獲取源碼等教程資料的朋友請點贊 + 評論 + 收藏,三連!

三連之后我會在評論區(qū)挨個私信發(fā)給你們~文章來源地址http://www.zghlxwxcb.cn/news/detail-639532.html

到了這里,關(guān)于基于Python 簡易實現(xiàn)接口測試自動化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • python實現(xiàn)基于RPC協(xié)議的接口自動化測試

    python實現(xiàn)基于RPC協(xié)議的接口自動化測試

    RPC(Remote Procedure Call)遠程過程調(diào)用協(xié)議是一個用于建立適當(dāng)框架的協(xié)議。從本質(zhì)上講,它使一臺機器上的程序能夠調(diào)用另一臺機器上的子程序,而不會意識到它是遠程的。 RPC 是一種軟件通信協(xié)議,一個程序可以用來向位于網(wǎng)絡(luò)上另一臺計算機的程序請求服務(wù),而不必了解

    2024年02月04日
    瀏覽(26)
  • 基于RPC協(xié)議的接口自動化測試可以用Python語言實現(xiàn)

    基于RPC協(xié)議的接口自動化測試可以用Python語言實現(xiàn)。下面是實現(xiàn)步驟: 1、安裝依賴庫,如protobuf、grpc。 2、編寫.proto文件定義接口參數(shù)和返回值。 3、使用protoc編譯.proto文件生成Python代碼。 4、編寫客戶端代碼調(diào)用遠程接口進行測試。 具體實現(xiàn)步驟如下: 1、安裝依賴庫 在終

    2024年02月08日
    瀏覽(25)
  • 基于 python 的接口自動化測試,讓你輕松掌握接口自動化

    基于 python 的接口自動化測試,讓你輕松掌握接口自動化

    目錄 目錄 一、簡介 ? ? ? ? ? ? ? ??編輯二、引言 三、環(huán)境準(zhǔn)備 四、測試接口準(zhǔn)備 接口信息 五、編寫接口測試 六、優(yōu)化 封裝接口調(diào)用 ? 本文從一個簡單的登錄接口測試入手,一步步調(diào)整優(yōu)化接口調(diào)用姿勢; 然后簡單討論了一下接口測試框架的要點; 最后介紹了一下

    2023年04月19日
    瀏覽(30)
  • 基于 Junit 的接口自動化測試框架實現(xiàn)

    基于 Junit 的接口自動化測試框架實現(xiàn)

    目錄 前言: 分層的自動化測試 接口測試的意義 接口測試框架選型 我們封裝的接口測試框架 接口測試關(guān)鍵實踐 測試代碼規(guī)范 (僅供參考) 前言: 基于JUnit的接口自動化測試框架可以實現(xiàn)對接口進行自動化測試,并提供了豐富的斷言和報告功能。JUnit是一個流行的Java單元測試

    2024年02月16日
    瀏覽(28)
  • 基于Python接口自動化測試框架(初級篇)附源碼

    基于Python接口自動化測試框架(初級篇)附源碼

    目錄 引言 框架設(shè)計思路 框架結(jié)構(gòu) 運行程序 總結(jié) 總結(jié): ? 很多人都知道,目前市場上很多自動化測試工具,比如:Jmeter,Postman,TestLink等,還有一些自動化測試平臺,那為啥還要開發(fā)接口自動化測試框架呢? 相同之處就不說了,先說一下工具的局限性: 1.測試數(shù)據(jù)不可控

    2024年02月11日
    瀏覽(21)
  • 如何實現(xiàn)基于場景的接口自動化測試用例?

    如何實現(xiàn)基于場景的接口自動化測試用例?

    自動化本身是為了提高工作效率,不論選擇何種框架,何種開發(fā)語言,我們最終想實現(xiàn)的效果,就是讓大家用最少的代碼,最小的投入,完成自動化測試的工作。 基于這個想法,我們的接口自動化測試思路如下: 1.不變的內(nèi)容全部通過配置化來實現(xiàn),比如:腳本執(zhí)行的環(huán)境、

    2024年02月14日
    瀏覽(22)
  • Python+Requests實現(xiàn)接口自動化測試

    Python+Requests實現(xiàn)接口自動化測試

    一般對于自動化的理解,有兩種方式的自動化。 第一,不需要寫代碼,完全由工具實現(xiàn),這種方式的工具一般是公司自己研發(fā)的,方便黑盒測試人員使用。這種工具的特點是學(xué)習(xí)成本低,方便使用,但是通用性不強,也就是換了一家公司,就很有可能無法使用之前的工具。

    2024年01月16日
    瀏覽(22)
  • 用Python搞定接口自動化測試:輕松實現(xiàn)RPC協(xié)議接口測試

    用Python搞定接口自動化測試:輕松實現(xiàn)RPC協(xié)議接口測試

    每天進步一點點,關(guān)注我哦,每天分享測試技術(shù)文章,文末有福利! 目錄:導(dǎo)讀 前言 一、什么是RPC 二、RPC框架 三、基于grpc框架服務(wù)的接口測試 01創(chuàng)建一個grpc服務(wù)接口 02調(diào)用grpc接口客戶端 03接口框架中適配grpc封裝 四、基于dubbo框架服務(wù)的接口測試 01、dubbo服務(wù)管理簡單使

    2024年02月01日
    瀏覽(21)
  • 可以用Python實現(xiàn)RPC協(xié)議的接口自動化測試

    基于RPC協(xié)議的接口自動化測試可以用Python語言實現(xiàn)。下面是實現(xiàn)步驟: 1、安裝依賴庫,如protobuf、grpc。 2、編寫.proto文件定義接口參數(shù)和返回值。 3、使用protoc編譯.proto文件生成Python代碼。 4、編寫客戶端代碼調(diào)用遠程接口進行測試。 具體實現(xiàn)步驟如下: 1、安裝依賴庫 在終

    2024年02月15日
    瀏覽(31)
  • 【Python+requests+unittest+excel】實現(xiàn)接口自動化測試框架

    【Python+requests+unittest+excel】實現(xiàn)接口自動化測試框架

    一、框架結(jié)構(gòu): ?工程目錄 二、Case文件設(shè)計 三、基礎(chǔ)包 base 3.1 封裝get/post請求(runmethon.py) 3.2 封裝mock(mock.py) 四、數(shù)據(jù)操作包 operation_data 4.1 獲取excel單元格中的內(nèi)容(get_data.py) ? 4.2?獲取excel中每個列(data_config.py) 4.3?解決數(shù)據(jù)依賴(dependent.py?) 五、工具類包 to

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包