接口自动化测试平台项目环境搭建

news2024/11/8 9:16:30

这篇文章主要记录开发接口自动化测试平台的尝试作---环境搭建和写一个项目管理模型。

电脑需要有python环境,且已经安装了django,我用的是python3.12 和 django 最新版本。写代码我使用的pycharm。

其中环境搭建大概分下面几步:

一、在代码存放路径打开终端,输入下面命令新建一个django项目Ifat

django-admin startproject Ifat

二、使用pycharm打开项目Ifat

三、给项目Ifat创建虚拟环境

补充:创建虚拟环境主要是为了减少不同项目环境之间的相互影响,也有利于更加专注于当前项目。

四、在虚拟环境中安装django

五、在项目Ifat中新建一个应用apitest,命令如下

python manage.py startapp apitest

django官方给出了项目和应用的解释,如下

 
  1. 项目 VS 应用

  2. 项目和应用有什么区别?

  3. 应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,

  4. 或者小型的投票程序。

  5. 项目则是一个网站使用的配置和应用的集合。

  6. 项目可以包含很多个应用,应用可以被很多个项目使用。

所以这个平台主要的逻辑都在apitest这个应用中实现。

六、将应用apitest安装到项目中,具体配置如下

补充:settings.py文件中主要是项目的一些相关配置,实际工作中用的是mysql数据库,为了方便专注于平台逻辑实现,暂时只用默认的sqlite3数据库,其他配置项可能会根据后面具体实现修改。

七、输入下面命令运行一下项目

python manage.py runserver

访问http://127.0.0.1:8000/,可以跳转到一个django的默认页面,此时和平台相关的内容还都没有,只要正常打开网页即可。

阶段性总结:上述7个步骤就是前期准备工作,后面会将各个模块的具体实现步骤都记录于此。

环境搭好了就开始尝试写一个简单的模块------项目管理模块。

 
  1. 首先了解一下django的MTV开发模式,这基本贯穿整个平台的开发过程。

  2. Model(模型):负责业务对象与数据库的对象(ORM),在这部分进行数据库字段的定义

  3. Template(模版):负责如何将数据渲染到页面并与用户交互

  4. View(视图):这部分主要实现具体业务逻辑,并与Model和Template交互

  5. 此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,

  6. view再调用相应的Model和Template

接下来开始拆解要做的项目管理模块,主要是项目的新增、编辑、删除这三块逻辑。根据MTV加url原则可知,需要进行如下四步:

  1. 在models中定义数据库字段

  2. 在views.py文件写逻辑,也就是具体的接口

  3. 新建template模板,写页面

  4. 新增urls.py文件,将不同url分发给views处理

(一) 先让项目跑起来

一、在models.py 文件中定义Department 和Project这两个类,用于存放不同部门和不同项目的数据,具体代码如下

 
  1. # models.py

  2. from django.db import models

  3. # Create your models here.

  4. class Department(models.Model):

  5. #部门名称

  6. name = models.CharField(max_length=100)

  7. # 是否删除

  8. is_delete = models.IntegerField(default=0)

  9. def __str__(self):

  10. return self.name

  11. class Project(models.Model):

  12. # 项目名称

  13. name = models.CharField(max_length=100)

  14. # 部门外键 关联到Department模型

  15. department = models.ForeignKey(Department, on_delete=models.CASCADE, default=1)

  16. # 是否删除

  17. is_delete = models.IntegerField(default=0)

  18. def __str__(self):

  19. return self.__class__()

  20. class Meta:

  21. # 按照department字段排序

  22. ordering = ['department']

二、在views.py文件中实现查询、新增项目信息以及保存入库的方法

 
  1. # views.py

  2. from django.shortcuts import render

  3. # Create your views here.

  4. from apitest.models import Department, Project

  5. def project(request):

  6. username = request.session.get('user', '')

  7. departments = Department.objects.filter(is_delete=0)

  8. department = Department.objects.filter(is_delete=0)[0]

  9. project_list = Project.objects.filter(is_delete=0, department=department)

  10. project = ''

  11. context = {"user": username,

  12. "projects": project_list,

  13. "departments": departments,

  14. "department": department,

  15. "project": project}

  16. # 将数据渲染到project.html,展示给用户

  17. return render(request, 'apitest/project.html', context)

  18. @csrf_exempt

  19. def department_onchange(request):

  20. departmentId = request.POST.get("departmentId", '')

  21. if (departmentId != '请选择部门' and departmentId != ''):

  22. department = Department.objects.get(id=departmentId)

  23. projects = Project.objects.filter(department=department, is_delete=0)

  24. else:

  25. projects = Project.objects.filter(is_delete=0)

  26. context = {'projects': projects}

  27. return render(request, "apitest/onchange_project.html", context)

  28. def add_project(request):

  29. departments = Department.objects.filter(is_delete=0)

  30. context = {'departments': departments}

  31. return render(request, "apitest/add_project.html", context)

  32. @csrf_exempt

  33. def add_project_to_db(request):

  34. projectName = request.POST.get("projectName", '')

  35. departmentId = request.POST.get("department", '')

  36. department = Department.objects.get(id=departmentId)

  37. project = Project.objects.create(name=projectName, department=department)

  38. projectId = project.id

  39. return HttpResponseRedirect('/apitest/project/' + str(departmentId) + '/' + str(projectId) + '/')

三、新建templates目录,并新建apitest二级目录,然后新建base.html、project.html、add_project.html、onchange_project.html文件,可以看到base.html里面引用了一些css、js、图片等文件,所以在static/apitest目录新建这些文件目录,并存放对应文件即可,目录结构如下图,代码太多了 就不放了。

四、在应用apitest下新建urls.py文件,将不同url分发给不同的views方法。具体位置如下

到此 基本逻辑已经完成,但是启动项目不会达到想要的效果,因为有两个问题没有解决:

  1. 项目url和应用url没有关联,导致web页面访问无效

  2. models.py文件只是创建了数据库字段,但是数据库中没有生成,导致访问对应的接口会报错提示找不到表。

解决第一个问题,在项目的urls.py文件中添加一下代码关联应用urls

解决第二个问题,在中端执行如下命令进行数据库迁移

 
  1. python manage.py makemigrations

  2. python manage.py migrate

需要注意的是

 
  1. 每次编辑 models.py 文件,改变模型,都需要执行下面两个命令。

  2. 运行 python manage.py makemigrations 为模型的改变生成迁移文件。

  3. 运行 python manage.py migrate 来应用数据库迁移。

  4. 关于数据库迁移相关的内容可以参考django文档了解更多 暂不展开

迁移完成后,使用pycharm的sqlite数据库手动新增几条数据进行初始化,然后保存提交

完成以上四个步骤,这个项目算是能跑起来了,但是项目管理模块的具体功能逻辑还没有完成,接下来就是完善该模块的具体功能。

(二) 完善剩余逻辑

写之前先捋一捋,考虑到公司部门变动不是很频繁,所以直接在数据库表中初始化了部门数据,没有提供部门的增删改逻辑。本文重点是项目管理模块,所以要实现项目的增删改查功能,上面第一部分中已经实现了新增项目的功能,接下来就直接实现删改查功能

一、实现项目列表页面以及项目查询接口逻辑,大概分3步

(1)首先写一个页面用于展示项目信息,命名为project_list.html,代码里删除部分的功能在第四步会实现。

(2)然后在views.py文件中新增查询接口

 
  1. @csrf_exempt

  2. def ajax_require_project(request):

  3. project_list = get_project_list(request)

  4. departments = Department.objects.filter(is_delete=0)

  5. context = {

  6. "projects": project_list,

  7. "departments": departments

  8. }

  9. return render(request, 'apitest/project_list.html', context)

其中get_project_list这个方法提出来放到新建的utils/projectsinfo.py这个文件中,这样看着views.py里面比较舒服。

 
  1. # -*- encoding: utf-8 -*-

  2. from apitest.models import Project

  3. def get_project_list(request):

  4. projectId = request.POST.get('project', '')

  5. departmentId = request.POST.get('department', '')

  6. if departmentId == '请选择部门' or departmentId == '':

  7. project_list_department = Project.objects.filter(is_delete=0)

  8. else:

  9. project_list_department = Project.objects.filter(department=departmentId, is_delete=0)

  10. if projectId == '请选择项目' or projectId == '':

  11. project_list_project = Project.objects.filter(is_delete=0)

  12. else:

  13. project_list_project = Project.objects.filter(id=projectId)

  14. a = list(set(project_list_department).intersection(set(project_list_project)))

  15. a.sort(key=lambda Project: Project.department.id, reverse=False)

  16. return a

(3)然后在urls.py文件中新增路由

path('ajax_require_project/', views.ajax_require_project, name='ajax_require_project'),

二、实现跳转到指定部门指定项目的接口逻辑,大概2步

(1)在view.py中实现接口

 
  1. def project_department_project(request, departmentId, projectId):

  2. data = get_department_project(departmentId, projectId)

  3. return render(request, 'apitest/project.html', data)

其中get_department_project方法在utils/projectsinfo.py中实现

 
  1. def get_department_project(departmentId, projectId):

  2. projects = Project.objects.filter(is_delete=0)

  3. departments = Department.objects.filter(is_delete=0)

  4. project = ''

  5. if departmentId == 0 or departmentId == '0':

  6. departmentId = 1

  7. else:

  8. department = Department.objects.get(id=departmentId)

  9. projects = Project.objects.filter(department=department)

  10. if projectId != 0 and projectId != '0' and projectId != '请选择项目':

  11. project = Project.objects.get(id=projectId)

  12. department = Department.objects.get(id=departmentId)

  13. data = {}

  14. data['departments'] = departments

  15. data['projects'] = projects

  16. data['department'] = department

  17. data['project'] = project

  18. return data

(2)然后在urls.py中新增路由

path('project/<int:departmentId>/<int:projectId>/', views.project_department_project, name='project'),

实现上述功能之后可以看到在新增一个项目点击保存跳转到一个新页面

三、实现编辑项目信息的功能,该功能分两个接口,一个是编辑接口,一个是编辑后保存数据入库接口。大概分3步

(1)首先写一个编辑项目信息的页面,命名为modify_project.html

(2)在views.py中写接口逻辑

 
  1. @csrf_exempt

  2. def modify_project(request, pid):

  3. project = get_object_or_404(Project, id=pid)

  4. departments = Department.objects.filter(is_delete=0)

  5. context = {'project': project, 'departments': departments}

  6. return render(request, "apitest/modify_project.html", context)

  7. @csrf_exempt

  8. def modify_project_to_db(request, pid):

  9. project = Project.objects.get(id=pid)

  10. projectName = request.POST.get("projectName", '')

  11. departmentId = request.POST.get("department", '')

  12. department = Department.objects.get(id=departmentId)

  13. project.name = projectName

  14. project.department = department

  15. project.save()

  16. return HttpResponseRedirect('/apitest/project/' + str(departmentId) + '/' + '0' + '/')

(3)在urls.py中新增具体路由

 
  1. path('modify_project/<int:pid>/', views.modify_project),

  2. path('modify_project_to_db/<int:pid>/', views.modify_project_to_db),

四、实现删除项目信息的接口逻辑,大概分2步

(1)在views.py中写接口逻辑

 
  1. @csrf_exempt

  2. def delete_project_to_db(request, pid):

  3. project = Project.objects.get(id=pid)

  4. project.is_delete = 1

  5. project.save()

  6. data = get_delete_info(request)

  7. return HttpResponseRedirect('/apitest/project/' + str(data["departmentId"]) + '/' + str(data["projectId"]) + '/')

其中get_delete_info方法在utils/projectsinfo.py中实现

 
  1. def get_delete_info(request):

  2. projectId = request.POST.get('project', '')

  3. departmentId = request.POST.get('department', '')

  4. department_0 = Department.objects.filter(is_delete=0)[0].id

  5. try:

  6. project = Project.objects.get(id=projectId, is_delete=0)

  7. except:

  8. projectId = 0

  9. if departmentId == '' or departmentId == '请选择部门':

  10. departmentId = department_0

  11. data = {}

  12. data["departmentId"] = departmentId

  13. data["projectId"] = projectId

  14. return data

(2)在urls.py中新增路由

path('delete_project/<int:pid>/', views.delete_project_to_db),

到这里,这个平台的项目管理模块的功能基本上就实现完成了,后面的运行环境、接口集合、定时任务、流程测试基本上都是这个套路,写一些增删改查的代码。另外,本文中前端代码都没贴,太多了就不一一展开了。

 

 感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2228488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle OCP认证考试考点详解082系列06

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 26. 第26题&#xff1a; 题目 解析及答案&#xff1a; 关于间隔&#xff08;INTERVAL&#xff09;数据类型&#xff0c;以下哪两个陈述是…

python的数据结构列表方法及扩展(栈和队列)

python的数据结构 python的list方法 list.append() 添加一个元素到列表末尾。list,append(num)相当于a[len(a):] [num] a [1,2,3,4,5] a.append(6) print(a) a[len(a):] [7] print(a)list.extend() 添加指定列表的所有元素。list.extend(nums)相当于a a nums a [1,2,3]…

highcharts的datalabels标签格式化

Highcharts的数据标签格式化 代码如下 plotOptions: {series: {dataLabels: {enabled: true,format: {y:.2f} mm}} },y就是当前数据点的值&#xff0c;.2f代表2位小数&#xff0c;效果如下图

如何安装自动化测试工具katalon?

一、下载&#xff0c;最下面有免费的版本 Katalon Studio 免费下载 |卡塔隆 二、安装 第一次安装&#xff0c;需要输入注册信息&#xff0c;注册成功之后&#xff0c;就可以使用了。

从简单的demo开始让您逐步了解GetX的用法

目录 前言 一、从demo开始体现下Getx的用法 二、从最简单的功能开始 1.新建一个Flutter工程 2.GetX初体验 1.路由跳转 1.普通路由跳转 2.跳转并从堆栈中销毁当前页面 3.跳转并销毁之前所有页面 4.跳转以及传值 2.更方便的实现SnackBar、Dialog、BottomSheet 三、Ge…

【无标题】从网红长沙看背后的湘菜产业

“吃什么&#xff1f;” 相信这是每一个来长沙旅游的人&#xff0c;面临的第一个问题。 近年来&#xff0c;长沙以美食为媒介&#xff0c;成功吸引了无数游客的目光。而湘菜&#xff0c;作为湖南最具特色的美食名片&#xff0c;无疑在这场美食盛宴中占据了举足轻重的地位。 …

使用 Qt 实现自定义罗盘控件

用 Qt 编写一个简单的罗盘控件&#xff0c;该控件能够动态显示方向。该控件实现了一个带有北&#xff08;N&#xff09;和南&#xff08;S&#xff09;标记的圆形罗盘面盘&#xff0c;具有可以根据输入角度旋转的指针。 代码功能概述 该项目定义了一个 CompassWidget 类&…

算法|牛客网华为机试21-30C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试10-20C 文章目录 HJ21 简单密码HJ22 汽水瓶HJ23 删除字符串中出现次数最少的字符HJ24 合唱队HJ25 数据分类处理HJ26 字符串排序HJ27 查找兄弟单词HJ28 素数伴侣HJ29 字符串加解密HJ30 字符串合并处理 HJ21 简单密码 题目描…

使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(二) ubuntu的下载安装

首先&#xff0c;Linux系统是人工智能和深度学习首选系统。原因如下: 开放性和自由度&#xff1a;Linux 是一个开源操作系统&#xff0c;允许开发者自由修改和分发代码。这在开发和研究阶段非常有用&#xff0c;因为开发者可以轻松地访问和修改底层代码。社区支持&#xff1a;…

【ECMAScript标准】深入解析ES5:现代JavaScript的基石

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ ES5的概述2️⃣ ES5的关键特性3️⃣ ES5与之前版本的区别4️⃣ …

【万户软件-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

第2章 Android App开发基础

第 2 章 Android App开发基础 bilibili学习地址 github代码地址 本章介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一 样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计…

文本分段Chunking综述-RAG

为什么要分段&#xff1f; 即便大模型开始普通支持更大的上下文&#xff0c;但 RAG 技术目前仍然具有不可替代的价值&#xff0c;RAG 需要外部知识库。外部知识文档往往比较长&#xff0c;可能是包含几十页甚至数百页的内容&#xff0c;如果直接使用会存在以下问题&#xff1a…

R语言 | paletteer包:拥有2100多个调色板!

看到 PMID:39024031 文章的代码中&#xff0c;有颜色设置的语句&#xff1a; pal <- paletteer_d("ggsci::category20_d3")[c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)]DimPlot(MM,reduction umap,group.by "sample",label F,pt.size 0.1,c…

怎么看AI大模型(LLM)、智能体(Agent)、知识库、向量数据库、知识图谱,RAG,AGI 的不同形态?

前言 在 AI 人工智能时代&#xff0c;智能体将会是未来最主流的大模型应用方式&#xff1f;人人都有机会通过智能体&#xff0c;解锁成为【超级个体】。 在人工智能的快速发展中&#xff0c;LLM、Agent、知识库、向量数据库、RAG&#xff08;检索增强生成&#xff09;、知识图…

照片不完整?来试试智能扩图,简直不要太满意!(不是广告)

生活中有些照片拍过之后&#xff0c;当时觉得很满意&#xff0c;但过段时间就恨当初没有拍一张完整的图片&#xff01; ——来自小白的感慨 当时跟家里的叮当一起去旅游&#xff0c;我给他拍了一张好看的照片&#xff1a; 今天这张照片如果是整图就好了&#xff01;好气哦&am…

idea连接数据库出现错误的解决方式

在使用idea连接数据库时&#xff0c;出现错误&#xff1a; The server has terminated the handshake. The protocol list option (enabledTLSProtocols) is set, this option might cause connection issues with some versions of MySQL. Consider removing the protocol li…

1. STM32环境搭建

1. MDK5(keil) 安装 安装包获取&#xff0c;可以在官网下载 https://www.keil.com/demo/eval/arm.htm 或者通过其他方式获取&#xff0c;下载 下载完有一个安装包和 “钥匙”&#xff0c;解压时关闭杀毒软件&#xff0c;防止被清理掉 1.1 安装 软件安装位置选择&#xff1a;…

map的oj题

第一题 . - 力扣&#xff08;LeetCode&#xff09; 第二题 单词识别_牛客题霸_牛客网 解题思路&#xff1a; 1&#xff0c;将数据放入set或者map中去重和更新次数, 即利用set和map的[ ] 2. 将数据放到vector 进行排序 &#xff0c;还应该利用仿函数写出 Compare() ,因为s…