【软件测试】博客系统项目测试报告(ssm项目)

news2024/10/5 17:18:07

文章目录

  • 一. 报告概要
  • 二. 引言
  • 三. 测试环境
  • 四. 测试执行概况及功能测试
    • 1. 手工测试
      • 1.1 编写测试用例
      • 1.2 执行部分测试用例
    • 2. 自动化测试Selenium
      • 2.1 编写测试用例
      • 2.2自动化测试代码
        • 1. 自动化测试工具类
        • 2. 博客登录页测试
        • 3. 博客注册页
        • 4. 博客详情页
        • 5. 博客编辑页
        • 6. 博客列表页
        • 7. 个人列表页
        • 8. 注销
    • 3. 测试结果
    • 4. 测试项目主要特点
  • 五. 其他

一. 报告概要

项目概要:基于ssm项目的博客系统测试
项目相关技术栈SpringBoot, SpringMVC ,MyBatis, MySQL, Redis, HTML, CSS, JavaScript
测试报告的目的:测试自己的博客项目是否符合预期结果.
范围和日期:2023年10月
测试执行的总体情况:主要针对常见功能进行测试例如:博客登录页面,博客列表页面,博客详情页,博客编辑页…

二. 引言

项目背景:巩固所学自动化测试相关知识.
测试目标:基于Servlet实现的博客系统.
测试策略进行说明:按照用户一般登录的逻辑编写测试用例并进行测试.
阐述测试的目的和重点:查缺补漏.

三. 测试环境

硬件:XiaoXinAir 14ALC 2021
软件:Google Chrome
开发工具:IDEA
测试工具:自动化测试工具Selenium
操作系统:Windows 10家庭中文版
浏览器版本:Google Chrome 117.0.5938.134(正式版本)(64 位)

四. 测试执行概况及功能测试

1. 手工测试

博客登录页:
在这里插入图片描述
博客注册页:
在这里插入图片描述
个人博客列表页:
在这里插入图片描述
博客主页:
在这里插入图片描述
博客详情页:
在这里插入图片描述

博客编辑页:
在这里插入图片描述

1.1 编写测试用例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 执行部分测试用例

  1. 博客登录页:界面能否正常加载,输入正确或错误的账号、密码是否能得到预期的响应
    (1)界面能否正常加载在这里插入图片描述
    (2)账号正确,密码错误
    预期结果:弹窗提登录失败,用户名或者密码输入错误
    实际结果如下:
    在这里插入图片描述
    (3)账号正确,密码为空
    预期结果:窗口提示请输入密码;
    实际结果如下:
    在这里插入图片描述
    (4)账号正确,密码正确
    预期结果:窗口跳转至个人博客列表页;
    实际结果如下:
    在这里插入图片描述2. 个人博客列表页:检测界面是否符合预期,点击“查看全文”按钮是否能跳转到对应的博客详情页,点击注销是否能退出登录
    (1)界面
    在这里插入图片描述
    (2)点击“查看全文”按钮是否能跳转到对应的博客详情页
    预期结果:进入到对应的博客详情页,且能够正确加载文章内容。
    实际结果如下:
    在这里插入图片描述
    (3)点击注销是否能退出登录
    预期结果:点击注销后退出跳转到博客列表页
    实际结果如下:
    在这里插入图片描述
    (4)点击修改
    预期结果:点击修改后跳转到文章编辑页
    实际结果如下:
    在这里插入图片描述
    (5)点击删除
    预期结果:点击删除后文章被删除
    实际结果如下:
    在这里插入图片描述

2. 自动化测试Selenium

由于随着项目版本的迭代,功能的逐渐增多,各种功能回归测试的需要,单纯的手工测试已经难以满足我们对于测试效率的要求,于是我们引入了自动化测试。它能够将人工从重复机械的测试过程中解放,使得人力资源能够投入到更加关键的测试中。

2.1 编写测试用例

在这里插入图片描述

2.2自动化测试代码

1. 自动化测试工具类

(包含截图测试):AutotestUtils

import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

 
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class AutotestUtils {
    static WebDriver webDriver;
    @BeforeAll
    static void SetUp() {
        webDriver = new ChromeDriver();
    }
    @AfterAll
    static void TearDown() {
        webDriver.quit();
    }
 
    //获取当前时间将截图按照时间保存
    public List<String> getTime(){
        //文件夹以天保存
        //截图以毫秒时间戳保存
        SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");
        SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");
        String filename=sim1.format(System.currentTimeMillis());
        String dirname=sim2.format(System.currentTimeMillis());
        List<String> list = new ArrayList<>();
        list.add(dirname);
        list.add(filename);
        return  list;
    }
 
    //获取屏幕截图,把所有的用例执行的结果保存下来
    public void getScreenShot(String str) throws IOException {
        List<String> list=getTime();
        String filename="E:\\TestClass\\blog_ssm_test\\src\\main\\java\\com\\blogautotest"+list.get(0)+"\\"+str+"_"+list.get(1)+".png";
        File srcfile=((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        //把屏幕截图生成的文件放到指定的路径
        FileUtils.copyFile(srcfile,new File(filename));
    }
}

测试截图如下所示:
在这里插入图片描述

2. 博客登录页测试

LoginCases:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class BlogCases extends AutotestUtils{
    static String name;
    /**
     *
     * 输入正确的账号,密码登录成功
     */
    @Order(1)
    @ParameterizedTest
    @CsvFileSource(resources = "LoginSuccess.csv")
    void LoginSuccess(String username, String password, String blog_list_url) throws IOException {
        System.out.println(username + password + blog_list_url);
        // 打开博客登录页面
        webDriver.get("http://localhost:8080/login.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入账号zhangsan
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入密码12345
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 跳转到列表页
        // 获取到当前页面url
        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
        getScreenShot(methodName);
        String cur_url = webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 如果url=http://localhost:8080/myblog_list.html,测试通过,否则测试不通过
        Assertions.assertEquals(blog_list_url, cur_url);
    }
//    账号正确,密码错误
    @Order(2)
    @ParameterizedTest
    @CsvSource({"admin,123","zhangsan,666"})
    void LoginAbnormal(String username,String password) throws InterruptedException {
        webDriver.get("http://localhost:8080/login.html");
        webDriver.findElement(By.cssSelector("#username")).clear();
        webDriver.findElement(By.cssSelector("#password")).clear();
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        //处理弹窗
        Thread.sleep(300);
        //获取弹窗内容
        String text=webDriver.switchTo().alert().getText();
        String except="登陆成功!";
        webDriver.switchTo().alert().accept();
        Assertions.assertNotEquals(except,text);
    }
}

3. 博客注册页
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;

import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;

public class RegCases extends AutotestUtils{
    @Order(1)
    @ParameterizedTest
    @CsvSource({"zhangsan,12345,12345,http://localhost:8080/login.html"})
    void regSuccess(String username,String password,String againpassword,String login_url) throws InterruptedException {
        //打开主页
        webDriver.get("http://localhost:8080/login.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //找到注册按钮并点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入注册的用户名,密码
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(againpassword);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //点击提交
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }
}

在这里插入图片描述

4. 博客详情页
    /**
     * 博客详情页校验
     * url
     * 博客标题
     * 页面title是“博客详情页”
     */
    @Order(4)
    @ParameterizedTest
    @MethodSource("Generator")
    void BlogDetail(String expected_url, String expected_title, String expected_blog_title) {
        // 打开博客列表页
        webDriver.get("http://localhost:8080/myblog_list.html");
        // 找到第一篇博客对应的产看全文按钮
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(4)")).click();
        // 获取当前页面url
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_url = webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 获取当前页面title
        String cur_title = webDriver.getTitle();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 获取博客标题
        String cur_blog_title = webDriver.findElement(By.cssSelector("#title")).getText();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        Assertions.assertEquals(expected_title ,cur_title);
        Assertions.assertEquals(expected_blog_title, cur_blog_title);
        if(cur_url.contains(expected_url)) {
            System.out.println("测试通过");
        } else {
            System.out.println(cur_url);
            System.out.println("测试不通过");
        }
    }
5. 博客编辑页
    //博客编辑页
    @Order(5)
    @Test
    void EditBlog() throws InterruptedException {
        // 打开博客列表页
        webDriver.get("http://localhost:8080/myblog_list.html");
        // 找到写博客按钮,点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 通过Js进行输入
        ((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
        sleep(3000);
        // 点击发布
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        sleep(3000);
        String cur_text = webDriver.switchTo().alert().getText();
        String expect_text = "恭喜:添加成功!是否继续添加文章?";
        Assertions.assertEquals(expect_text,cur_text);
    }
6. 博客列表页
    /**
     * 校验已发布博客标题
     * 校验已发布博客时间
     * 博客列表页
     */
    @Order(6)
    @Test
    void BlogInfoChecked() {
        webDriver.switchTo().alert().dismiss();
        webDriver.get("http://localhost:8080/blog_list.html");
        // 获取第一篇博客标题
        String first_blog_title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getText();
        // 获取第一篇博客发布时间
        String first_blog_time = webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/div[2]")).getText();
        // 校验博客标题是不是自动化测试
        Assertions.assertEquals("自动化测试", first_blog_title);
        // 如果时间是2023-5-23年发布的,测试通过
        if(first_blog_title.contains("2023-10")) {
            System.out.println("测试通过");
        } else {
            System.out.println("当前时间是:" + first_blog_time);
            System.out.println("测试不通过");
        }
    }
7. 个人列表页

删除功能:

    /**
     * 个人列表页
     * 删除第一篇博客
     */
    @Order(7)
    @Test
    void DeleteBlog() throws InterruptedException {
        // 打开个人博客列表页面
        webDriver.get("http://localhost:8080/myblog_list.html");
        // 点击删除按钮
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(6)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.switchTo().alert().accept();
    }
8. 注销
    //注销
    @Order(8)
    @Test
    void Logout() {
        webDriver.switchTo().alert().accept();
        // 打开个人博客列表页面
        //点击注销
        webDriver.get("http://localhost:8080/myblog_list.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        webDriver.switchTo().alert().accept();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 校验url 注销后进入博客列表页
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://localhost:8080/blog_list.html", cur_url);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }

3. 测试结果

在这里插入图片描述
测试通过.其中博客详情页被忽略是因为和博客删除页有(业务逻辑)冲突.并不影响测试结果.单独测试详情页是通过的.

4. 测试项目主要特点

  1. 采用自动化测试工具和框架,编写自动化测试脚本,提高测试效率和稳定性。自动化测试可以涵盖UI测试减少人力投入,并且可以进行持续集成和持续交付。
  2. 使用参数化,保持用例的整洁,提高代码的可读性。
  3. 使用隐式等待,提高了自动化运行效率,提高了自动化的稳定性。
  4. 使用屏幕截图,方便问题的溯源以及解决。

五. 其他

除上述描述之外,一份完整的测试报告还包含以下方面等:

  1. 性能测试:如果有进行性能测试,记录测试结果并进行分析,包括测试的负载、响应时间、吞吐量等指标。
  2. 安全测试:如果有进行安全测试,记录测试结果,包括发现的安全漏洞、风险评估等。
  3. 缺陷管理:列出在测试过程中发现的缺陷,包括缺陷编号、描述、严重程度、优先级等,并注明缺陷的状态和解决情况。
  4. 测试总结:对测试的结果进行总结和评估,包括测试覆盖率、质量评估、风险评估等,提供对于软件质量的综合评价。
  5. 建议和改进:根据测试过程和结果,提出测试团队对项目或者流程的建议和改进意见。
  6. 附件:提供测试脚本、日志、截图等相关附件,以便读者进一步了解测试过程和结果。

此处我们不做过多阐述.到公司后熟悉即可.同时,在编写测试报告时,需要注意以下几点:

  1. 报告应该清晰、简洁,并且易于理解和使用。应尽可能避免使用过多技术术语和复杂的语言。
  2. 报告中应该准确记录测试过程和结果,包括测试用例的执行状况、发现的缺陷、测试数据和环境等信息。
  3. 对测试结果进行全面的分析和评估,提供对于软件质量的综合评价。
  4. 对于缺陷管理和解决情况进行详细记录,并定期更新缺陷列表,以便开发人员能够及时修复问题。

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

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

相关文章

易点易动:解决纸质固定资产审批痛点,助您高效自定义审批流程

固定资产审批是企业日常管理中不可或缺的环节&#xff0c;然而&#xff0c;传统的纸质审批流程常常面临繁琐、低效的问题。易点易动作为一款先进的固定资产管理系统&#xff0c;以其自定义设置流程的特点&#xff0c;为企业打破审批瓶颈&#xff0c;实现高效审批提供了理想解决…

轻量级虚拟化技术草稿

Support Tech ST.1 virtiofs ST.1.1 fuse framework 引用wiki中关于fuse的定义&#xff1a; Filesystem in Userspace (FUSE) is a software interface for Unix and Unix-like computer operating systems that lets non-privileged users create their own file systems w…

Python 编程基础概念

目录 1 Python程序的构成1.1 使用\行连接符 2 对象3 引用4 标识符4.1 Python标识符命名规则 5 变量和简单赋值语句5.1 变量的声明和赋值5.2 删除变量和垃圾回收机制5.3 链式赋值5.4 系列解包赋值5.5 常量 6 最基本内置数据类型和运算符6.1 基本运算符6.2 整数6.3 浮点数6.4 类型…

华为数通方向HCIP-DataCom H12-831题库(多选题:241-259)

第241题 设备产生的信息可以向多个方向输出信息,为了便于各个方向信息的输出控制,信息中心定义了10条信息通道,使通道之间独立输出,缺省情况下,以下哪些通道对应的输出方向可以接收Trap信息? A、console通道 B、logbuffer通道 C、snmpagent通道 D、trapbuffer通道 答案:…

山西电力市场日前价格预测【2023-10-11】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-11&#xff09;山西电力市场全天平均日前电价为507.37元/MWh。其中&#xff0c;最高日前电价为873.70元/MWh&#xff0c;预计出现在18: 45。最低日前电价为313.23元/MWh&#xff0c;预计…

互联网从业者如何调节压力

互联网从业者面临着多种压力源&#xff0c;如工作性质、竞争、项目失败、对失败的恐惧等&#xff0c;这些压力会影响身心健康以及工作效率。因此&#xff0c;采取有效的压力调节方法是必要的&#xff0c;接下来我们从三个方向探讨下互联网从业者有关压力来源、应对压力的方法及…

leetcode每日一练-第977题-有序数组的平方

一、思路 双指针 二、 解题方法 i指向起始位置&#xff0c;j指向终止位置。 定义一个新数组result&#xff0c;和A数组一样的大小&#xff0c;让k指向result数组终止位置。 如果A[i] * A[i] < A[j] * A[j] 那么result[k--] A[j] * A[j]; 。 如果A[i] * A[i] > A[j…

Echarts使用感受

目录 数据处理 遇到的问题 更换echart主题 Y轴数字后添加百分比号 eCharts饼图显示百分比 echarts自定义主题的手把手教学 查看UI图 点击下方链接页面的定制主题按钮 点击下载主题 点击主题下载的JSON版本&#xff0c;点击复制 ​编辑 新建js文件&#xff0c;把复制的…

【Java】什么是API

API (Application Programming Interface,应用程序编程接口) Java中的API 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层封装起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要学习这些类如何使用即可&#xff0c;我们可以通过帮助文档…

二、监控搭建-Prometheus-采集端部署

二、监控搭建-Prometheus-采集端部署 1、背景2、目标3、传承4、操作 1、背景 在上一篇中我们搭建了Prometheus平台&#xff0c;平台的搭建跟Linux系统上面安装了vim软件一样&#xff0c;给的只是一个很好的铸剑玄铁&#xff0c;具体的使用需要打磨和配件的运用。 2、目标 使…

XGBoost 2.0:对基于树的方法进行了重大更新

XGBoost是处理不同类型表格数据的最著名的算法&#xff0c;LightGBM 和Catboost也是为了修改他的缺陷而发布的。9月12日XGBoost发布了新的2.0版&#xff0c;本文除了介绍让XGBoost的完整历史以外&#xff0c;还将介绍新机制和更新。 这是一篇很长的文章&#xff0c;因为我们首…

转守为攻,亚马逊云换帅背后的战略转向

点击关注 文&#xff5c;刘雨琦 一则人事任命&#xff0c;揭开了亚马逊云在大中华区反击战的序幕。 10月9日&#xff0c;亚马逊云科技全球销售、市场和服务高级副总裁 Matt Garman 宣布了大中华区领导人变更任命&#xff0c;储瑞松将接替张文翊担任该职位&#xff0c;继续带领…

2023年网络安全岗位有哪些?金九银十别错过秋招!

网络安全有哪些岗位&#xff1f; 1. 安全服务工程师 7-10k 网络安全工程师、安全项目经理&#xff1a;主要负责甲方设备安全调试工作。需精通服务器、网络技术以及安全设备原理与配置。 2. 安全运维工程师 7-10k 安全运维工程师&#xff0c;主要对己方安全防御体系的运维和应急…

如何在 Spring Boot 中提高应用程序的安全性

如何在 Spring Boot 中提高应用程序的安全性 Spring Boot是一种流行的Java开发框架&#xff0c;用于构建Web应用程序和微服务。在构建应用程序时&#xff0c;安全性是至关重要的因素。不论您的应用程序是面向公众用户还是企业内部使用&#xff0c;都需要采取适当的措施来确保数…

(java)(python)以代理IP的方式进行请求数据

文章目录 前言(java)(python)以代理IP的方式进行请求数据1. python2. java 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话…

洛谷100题DAY7

31.P1636 Einstein学画画 此题为欧拉通路&#xff0c;必须要满足奇点的个数为0或2个 奇点&#xff1a;度数&#xff08;入度出度&#xff09;为奇数的点 如果奇点为2个或者0个就可以直接一笔化成 eg. 我们发现奇数点个数每增加2个就多一笔 #include<bits/stdc.h> us…

数据结构和算法(11):红黑树

概述 伸展树实现简便、无需修改节点结构、分摊复杂度低&#xff0c;但可惜最坏情况下的单次操作需要O(n)时间。 AVL树尽管可以保证最坏情况下的单次操作速度&#xff0c;但需在节点中嵌入平衡因子等标识&#xff1b;更重要的是&#xff0c;删除操作之后的重平衡可能需做多达O(…

【DRAM存储器十三】DDR介绍-功能框图和模式寄存器解析

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR数据手册》 目录 DDR SDRAM芯片引脚 DDR SDRAM芯片框…

校园跑腿小程序还受欢迎不?

校园跑腿小程序是如今大学生群体中越来越受欢迎的一种服务模式。它为大学生提供了一个便捷的平台&#xff0c;使他们能够在校园内完成各类生活事务&#xff0c;如购买食品、快递取送、打印复印等。这种形式的服务在过去几年里在全球范围内迅速发展&#xff0c;并取得了巨大的成…

大学专业分类及介绍 专业有哪些

大学的专业非常多样化&#xff0c;涵盖了哲学、经济学、法学、教育学、文学、历史学、理学、工学、农学、医学、管理学、艺术学等12个学科门类。每个学科门类下又设有多个具体专业。 哲学类下设专业有4个&#xff0c;包括哲学、逻辑学、宗教学、伦理学。 经济学类下设专业有17…