• 接口自动化测试框架搭建全部过程


    思想:
        1、基本目录的搭建
            report:静态输出目录(报告或者日志)
            
            data:静态输入目录(可以存放Excel数据,被读取的一些数据)
            
            utils:实用方法层(这里存放的是项目的公共方法,一般拿到别的项目可以直接使用,列如:读取Excel中的数据,连接数据库,)
            
            apis:接口请求层(这里封装的方法一般都是和项目有关系,列如:发送post请求,发送get请求,登录接口,注册接口,支付接口,加入购物车接口)
            
            testcases:用例目录(用来存放项目中涉及到的用例,用例即包含单接口用例,也包含关联接口用例,管理目录时,也可以通过目录分层结构管理)
            
            conftest:这里存放的是fixture,只对文件的所在目录生效,如果只是单目录用例那么可以在根目录下创建,如果分为分层目录结构的用例,那么为了
                     
                     满足当前目录的用例,可以在该目录下创建一个conftest,用来存放fixture,fixture是pytest框架的根髓
            
            pytest.ini:是pytest的配置文件,可用来存放一些运行配置项,如:-v -s ;或者配置日志输出渠道;该文件的具体配置,可百度学习
            
        2、接口框架的重要思想=======》金字塔的配置
            
            ①report=data---》utils=apis=---》conftest---》pytest.ini---》testcases
            
            ②以上相当于金字塔结构,从左至右为从底部到顶部的过程
            
            ③金字塔精髓之处在于,(上部依赖底部,底部不依赖于上部),举一个列子,(testcases中的用例,需要调用apis目录中的接口请求方法,而apis不会去主动调用testcases),所以
            
                在工作中,我们如果修改了某一个文件,需要往上找,看看谁调用了这个文件,相对应的进行修改

    1. ##########################utils中的db.py的封装
    2. import pymysql
    3. #
    4. # # 1. 连接数据库
    5. # conn = pymysql.connect(
    6. # host='服务器地址',
    7. # port=3306,
    8. # user='用户名',
    9. # password='密码',
    10. # db='数据库名'
    11. # )
    12. # # 2. 建立游标
    13. # cur = conn.cursor(pymysql.cursors.DictCursor) # 没有s 有括号
    14. #
    15. # # 3. 执行sql
    16. # # 3.1 执行查询
    17. # cur.execute("SELECT * FROM cardInfo WHERE cardNumber='hzc_00011';")
    18. # conn.commit()
    19. # # 获取结果
    20. # result = cur.fetchall()
    21. # # result = cur.fetchone() # 取一条少一条
    22. # # cur.fetchmany(3)
    23. # print(result)
    24. #
    25. # # 3.2 执行修改
    26. # # cur.execute("DELETE FROM cardInfo WHERE cardNumber='hzc_00011';")
    27. # # conn.commit()
    28. #
    29. # # 4. 关闭
    30. # cur.close()
    31. # conn.close()
    32. class DB(object):
    33. def __init__(self):
    34. self.conn = pymysql.connect(
    35. host='服务器地址',
    36. port=3306,
    37. user='用户名',
    38. password='密码',
    39. db='数据库名',
    40. autocommit=True
    41. )
    42. self.cur = self.conn.cursor(pymysql.cursors.DictCursor) #添加此配置项,默认commit了,即建立游标
    43. def do_sql(self, sql):
    44. print('执行sql', sql)
    45. self.cur.execute(sql) #执行sql语句
    46. # self.conn.commit()
    47. return self.cur.fetchall() #返回查询到的所有结果
    48. class FuelCardDB(DB): #继承DB
    49. """执行具体的sql语句"""
    50. def del_card(self, card_number):
    51. """执行删除语句"""
    52. self.do_sql(f"DELETE FROM cardInfo WHERE cardNumber='{card_number}'")
    53. def check_card(self, card_number):
    54. """执行查询语句"""
    55. result = self.do_sql(f"SELECT * FROM cardInfo WHERE cardNumber='{card_number}';")
    56. if result:
    57. return True
    58. return False
    59. def add_card(self, card_number):
    60. """执行添加语句"""
    61. result = self.check_card(card_number)
    62. if not result:
    63. self.do_sql(f"INSERT INTO cardInfo (cardNumber) VALUES ('{card_number}');")

    #######################api文件的封装

    思想:该文件可以将不同的请求方法,不同的请求地址接口,封装成一个类,然后在用例层用到了哪一个就去调取哪一个
    以下实列是添加加油卡项目

    1. import requests
    2. DATA_SOURCE_ID = "bHRz"
    3. class Api(object):
    4. def __init__(self, base_url):
    5. self.url = base_url + '/gasStation/process'
    6. self.session = requests.session()
    7. def add_fuelcard(self, card_number):
    8. json_data = {"dataSourceId": DATA_SOURCE_ID, "methodId": "00A", "CardInfo": {"cardNumber": card_number}}
    9. res = self.session.post(self.url, json=json_data)
    10. print(res.text)
    11. return res
    12. def bind_card(self, user_name, id_type, id_number, card_number):
    13. json_data = {
    14. "dataSourceId": DATA_SOURCE_ID,
    15. "methodId": "01A",
    16. "CardUser": {
    17. "userName": user_name,
    18. "idType": id_type,
    19. "idNumber": id_number
    20. },
    21. "CardInfo": {
    22. "cardNumber": card_number
    23. }
    24. }
    25. res = self.session.post(self.url, json=json_data)
    26. print(res.text)
    27. return res
    28. def query_card(self, user_id, card_number):
    29. #dataSourceId=bHRjczEx&userId=1039&cardNumber=1111111111&methodId=02A
    30. params = {
    31. "dataSourceId": DATA_SOURCE_ID,
    32. "methodId": "02A",
    33. "userId": user_id,
    34. "cardNumber": card_number
    35. }
    36. res = self.session.get(self.url, params=params)
    37. print(res.text)
    38. return res

    思想:该文件下主要封装的是fixtures方法,即为了简化用例层步骤,可以将操作前提步骤和过程步骤在此文件下完成,在该文件下
    有一个base_url,这个是安装的插件,安装方法为pip install pytest-base-url

    1. import pytest
    2. from utils.db import FuelCardDB
    3. from apis.fuelcard_api import Api
    4. @pytest.fixture(scope='session')
    5. def db():
    6.    #实例化一个对象
    7. return FuelCardDB()
    8. @pytest.fixture(scope='session')
    9. def api(base_url):
    10.   #实例化一个对象,并将配置文件中的base_url传给Api层的方法
    11. return Api(base_url)
    12. @pytest.fixture
    13. def del_card(db):
    14. def _del_card(card_number):
    15. db.del_card(card_number)
    16. yield
    17. db.del_card(card_number)
    18. return _del_card

    #######################pytest.ini文件的封装

    思想:上述已说明,该文件为pytest框架的配置文件,即运行用例时会默认执行该文件操纵,注意表达格式,conftest文件和api文件中
    都用到了base_url,就是这里的base_url,目的是当服务器地址变了之后,不用去接口层去一一修改服务器地址,只需要修改这里的地址就行,但是
    如果接口的请求地址变了,就要去一一修改了,毕竟针对不同的请求地址封装了不同的方法

    1. [pytest]
    2. addopts = -s --html=reports/report.html --self-contained-html
    3. testpaths = testcases
    4. base_url = http://***.***.***.***:***

    #######################总结

    ①接口的主要框架基本已经出来了,当我们需要其他方法时,可以再去相对应的添加,例如读取excel表格数据的方法,可以再封装到utils目录下

    ②如果需要公共的方法时,可以去百度查一下别人写好的模块,说实话自己写半天也不如人家封装好的实用性更高,我们的目标就是会使用别人封装好的方法就OK了

    ③如果涉及到自己的业务模块,就要自己去封装了,例如上面所说的,api文件,conftest文件,都是和业务相关的

    ④对于初级的自动化测试人员,最主要的不是去写框架,而是去运用好别人写好的框架,来设计用例,写用例

    ⑤一条用例的基本流程:测试环境准备、测试数据准备、发送数据、获取数据响应结果、设置断言、环境清理

    7天练完接口自动化测试30个实战项目,28K入职字节测试岗。【自动化测试/接口测试/软件测试/性能测试/Jmeter】

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    在这里插入图片描述

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

  • 相关阅读:
    2024.05.14 Diffusion 代码学习笔记
    2000字助你精通防抖与节流
    【LeetCode】94. 二叉树的中序遍历
    scipy.sparse.coo_matrix.sum()关于axis的用法
    我要写整个中文互联网界最牛逼的JVM系列教程 | 「类加载子系统」章节:类的加载过程之二:Linking
    【论文阅读|深读】SDNE:Structural Deep Network Embedding
    Aspose.PDF for Java Crack by Xacker
    短视频内容运营师是做什么的,行业前景如何?
    【高效办公_PDF】如何快速批量整合多个PDF???---Python方法
    简单了解一下国产操作系统
  • 原文地址:https://blog.csdn.net/2301_78276982/article/details/133172794