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

news/2025/1/1 6:29: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.ppmy.cn/news/1559144.html

相关文章

Vue异步处理、异步请求

Vue.js 是一个用于构建用户界面的渐进式JavaScript框架&#xff0c;它允许开发者以声明式的方式编写异步操作。在 Vue 中处理异步任务非常重要&#xff0c;因为很多现代Web应用都需要与后端API交互、执行耗时计算或管理复杂的异步流程。以下是对 Vue 中异步处理的详细讲解&…

5-pandas常用操作2

前言 一、df.max() 计算每列最大值 二、df.apply() 1.可以传函数 代码如下&#xff08;示例&#xff09;&#xff1a; # lambda 匿名函数自定义 f lambda x:x.max()-x.min() # x参数 冒号后是返回值 df.apply(f) # 默认axis0,所以这里是按列求最大值-最小值2.可以直…

十六、流编辑器sed(stream editor)

一、sed简介 sed是一种流编辑器&#xff0c;处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为模式空间&#xff0c;接着用sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕。接着处理下一行&#xff0c;这样不断重复&a…

网络协议入门

一、概述 1、模型 为了减少协议设计的复杂性&#xff0c;大多数网络模型均采用分层的方式来组织。每一层都有自己的功能&#xff0c;就像建筑物一样&#xff0c;每一层都靠下一层支持。每一层利用下一层提供的服务来为上一层提供服务&#xff0c;本层服务的实现细节对上层屏蔽…

微信小程序打印生产环境日志

微信小程序打印生产环境日志 新建一个log.js文件&#xff0c;写入以下代码&#xff1a; let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…

关于信息安全的学习

0x00.前言 应钟老师的邀请&#xff0c;给304实验室的同学们做了一个关于如何学习信息安全的讲座。 正好总结一下关于信息安全方面的学习方法&#xff0c;以后也可以给学弟学妹们参考一下。 0x01.正文 &#xff08;1&#xff09;信息安全简介&#xff1a; 信息安全呢&#xff0…

详细解读ITSS

ITSS是信息技术服务标准&#xff08;Information Technology Service Standards&#xff09;的简称&#xff0c;以下是对ITSS的详细解读&#xff1a; 一、背景与制定 ITSS是在工业和信息化部、国家标准化管理委员会的联合指导下&#xff0c;由国家信息技术服务标准工作组&…

通用导出任何对象列表数据的excel工具类

在工作中经常会遇到列表数据的导出&#xff0c;每次需要的时候都要去开发一次&#xff0c;且数据不断在变化&#xff0c;于是就有了下述的工具类&#xff0c;可传入各种实体对象的List&#xff0c;最终以指定格式导出excel&#xff0c;废话不多说&#xff0c;上代码~ 控制层代…