个人博客系统(测试报告)

一、项目背景

    一个Web网站程序,你可以观看到其他用户博客也可以登录自己的账号发布博客,通过使用Selenium定位web元素、操作测试对象等方法来对个人博客系统的进行测试,测试的核心内容有用户登录、博客列表及博客数量的展示、查看全文、写博客、删除博客、注销账号等,该个人博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看

二、测试主要任务

1.功能测试

1.1编写手工测试用例

   设计测试用例方法主要从 功能测试、界面测试、性能测试、兼容性测试、易用性测试、安全测试、弱网测试等七个方面进行设计,但个人博客的测试主要就是针对核心功能进行测试脑图展示如下:

1.2实际执行用例

1.2.1登录
(1)介绍

用户名以及密码已经在后端写入了数据库是已经存在的,登录成功后就会跳转到列表页面;执行用户注销操作后,也会回到登录页面。

(2)测试用例展示

a)界面

b)输入正确的账号和密码(以用户"duanxiao123"为例): 

预期结果:跳转到博客列表页。

实际结果如下:

c)输入错误的账号或密码

预期结果:提示用户输入错误。

实际结果如下:

1.2.2博客列表及博客数量的展示

(1)介绍

可以在列表页(主页)查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。

(2)测试用例展示

a)列表页界面(显示博客数量不为0等)

1.2.3写博客&&发布博客
(1)介绍

在博客列表页点击“写博客”之后就会进入博客编辑页面,此时就可以进行新博客的写入。

(2)测试用例展示

a)列表页界面

b)点击“写博客按钮”,跳转到博客编辑页

c)输入标题和正文(在控制台输入js脚本)

预期结果:标题和正文都能正确写入并且没有非法字符。

实际结果:

d)发布博客

预期结果:博客发布成功并跳转到列表页在博客列表页显示文章标题和发布时间。

实际结果:

1.2.4查看全文
(1)介绍

在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容;在博客详情页也可以点击“作者主页”查看是否正常跳转。

(2)测试用例展示

a)列表页界面

b)点击第一篇博客查看全文按钮

预期结果:进入到对应的博客详情页。

实际结果:

c)点击“作者主页”按钮

预期结果:跳转到对应的博客列表页且文章数量不变。

实际结果:

1.2.5删除博客
(1)介绍

列表页界面找到一篇待删除博客点击“查看全文”按钮跳转到博客详情页,在博客详情页点击“删除按钮”跳转到对应的博客列表页且被删除文章不存在。

(2)测试用例展示

a)列表页界面

b)找到一篇待删除博客点击“查看全文”按钮

b)点击“删除”按钮

预期结果:跳转到对应的博客列表页且被删除文章不存在。

实际结果:

1.2.6注销博客
(1)介绍

在列表页面点击“注销”按钮就会跳转到博客登录页,此时用户名和密码栏数据清空,但界面可以正常使用。

(2)测试用例展示

a)列表页界面

b)点击“注销”按钮

预期结果:删除会话信息,跳转到博客登录页,且登陆页面账号密码被清空。

实际结果:

2.使用Selenium进行Web自动化测试

2.1引入pom.xml依赖

我们需要创建Maven项目引入如下依赖(selenium4、junit5等):

<dependencies>
<!--        添加selenium依赖--><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><!--        添加junit5依赖--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency></dependencies>

2.2 创建驱动和释放驱动类

创建一个驱动类(自定义名为InitAndEnd),在对博客登录页、博客列表页、博客编辑页、博客详情页,这几个页面分别进行测试时,都有一个初始化动作(创建驱动)和退出动作(退出浏览器),那么我们便可以把创建驱动和释放驱动这个操作放在一个类中,并设置驱动对象为静态的,就可以让创建和销毁驱动的步骤执行一次,其他类如果需要驱动直接继承该类。

package Blog;import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;/*** Created with IntelliJ IDEA.* Description:* User: 咚咚咚咚* Date: 2024-02-27* Time: 17:31*/
public class InitAndEnd {static WebDriver webDriver;@BeforeAll//创建驱动-----初始化动作static void SetUp(){webDriver=new ChromeDriver();}
@AfterAll//退出浏览器--------退出动作static void TearDown(){webDriver.quit();
}
}

2.3创建测试套件类

创建一个测试套件类(自定义名为RunSuite),通过 @Suite 注解标识该类为测试套件类,然后使用 @SelectClasses的参数指定执行类的顺序(通过这个类来运行测试用例),通过套件一次执行所有要运行的测试用例,大大提高了效率。(本项目中对各个测试点写成了方法,放在BlogCases里;没有将测试点写成类,故没有用到测试套件,这里主要对测试套件功能做简介)

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;/*** Created with IntelliJ IDEA.* Description:* User: 咚咚咚咚* Date: 2024-02-27* Time: 16:20*/
//测试套件/*.通过class进行测试用例的运行@Suite@SelectClasses({junitTest01.class,junit5Test02.class})*///通过package进行测试用例的运行@Suite@SelectPackages(value={"Test01","Test02"})
public class RunSuite {
}

2.4博客“登录“自动化测试

①创建一个博客测试类(自定义名为BlogCases)继承AutoTestUtils类,得到驱动

②创建 LoginSuccess()方法

③在这个界面下分别对打开网页是否正常,并使用参数化注解对登录正常模块、登录异常模块分别进行测试

 ④使用Order注解指定测试顺序,否则可能会因为执行顺序不对导致测试失败

⑤注意清空内容后才能再次输入用户名以及密码

代码和详细注释如下:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//指定类的执行顺序
//extends InitAndEnd让每个测试用例都有初始化和退出动作
public class BlogCases extends InitAndEnd {/**** 1.输入正确的账号密码,显示登陆成功** */@Order(1)@ParameterizedTest//参数化//例如admin和passage内容可更改,不同的用户账号密码可以进行传参来变化@CsvFileSource(resources = "LoginSuccess.csv")//@Test//表示当前是一个测试用例,有 @ParameterizedTest//参数化时不用void LoginSuccess(String username,String password,String expected_list_url,String expected_nickName) throws InterruptedException {System.out.println(username + password + expected_list_url +expected_nickName);//打开博客登录页面webDriver.get("http://122.51.27.48:8080/login.html");
//智能等待webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//输入用户名duanxiao123
webDriver.findElement(By.cssSelector("#userName")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入passage=“123”webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//点击提交按钮webDriver.findElement(By.cssSelector("body > div.container > div > form > div:nth-child(4) > button")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//跳转到列表页(断言url,断言admin)//获取到当前列表页urlsleep(5000);String currentUrl = webDriver.getCurrentUrl();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);System.out.println(currentUrl);//如果url=”expected_list_url“,测试通过,否则测试不通过Assertions.assertEquals(expected_list_url,currentUrl);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//获取到当前昵称名String cur_nickName=webDriver.findElement(By.cssSelector("#nickname")).getText();//获取到名称文本//如果昵称=”duanxiao“,测试通过,否则不通过Assertions.assertEquals(expected_nickName,cur_nickName);}

测试结果如下:

2.5博客”列表中博客数量“自动化测试

①在BlogCases类中添加BlogList()方法

②在这个界面下对“博客数量是否为0”进行测试

②在这个界面下对“删除博客”进行测试

②在这个方法下对“注销博客”进行测试

 ③使用Order注解指定测试顺序,否则可能会因为执行顺序不对导致测试失败

“博客数量是否为0”进行测试代码和详细注释如下:

        /**** 博客列表页博客数量不为0** */@Order(2)@Testvoid BlogList(){//打开博客列表页webDriver.get("http://122.51.27.48:8080/list.html");String currentUrl = webDriver.getCurrentUrl();System.out.println(currentUrl);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//获取列表页所有博客标题对应的元素int size = webDriver.findElements(By.cssSelector(".title")).size();//断言----如果元素数量不为0,测试通过Assertions.assertNotEquals(0,size);}

“博客数量是否为0”进行测试结果如下:

2.6”写博客“&&”发布博客“自动化测试

①在BlogCases类中添加editBlog()和blod_info_checked()方法

②在这个界面下分别对打开网页是否正常、测试输入标题和正文博客是否可以正常发布、测试“写博客”按钮是否可以正常使用

 ③使用Order注解指定测试顺序,否则可能会因为执行顺序不对导致测试失败

代码和详细注释如下:

  @Order(3)@Testvoid editBlog() throws InterruptedException {//找到写博客按钮并点击webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//找到输入框webDriver.findElement(By.cssSelector("#title"));// 输入标题(通过js将标题进行输入)webdriver需强制类型转换( (JavascriptExecutor)webDriver ).executeScript("document.getElementById(\"title\").value=\"111\"");sleep(3000);//点击发布webDriver.findElement(By.cssSelector("body > div.edit-container > div.edit-title > button")).click();
//sleep(3000);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.switchTo().alert().accept();sleep(3000);webDriver.switchTo().alert().dismiss();((JavascriptExecutor) webDriver).executeScript("document.documentElement.scrollTop=1000000");//获取当前页面url进行断言String currentUrl = webDriver.getCurrentUrl();System.out.println(currentUrl);Assertions.assertEquals("http://122.51.27.48:8080/list.html",currentUrl);}/*** 校验是否发布成功(校验已发布博客的标题和时间)**/@Order(4)@Testvoid blod_info_checked() throws InterruptedException {webDriver.get("http://122.51.27.48:8080/list.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);((JavascriptExecutor) webDriver).executeScript("document.documentElement.scrollTop=1000000");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//校验已发布博客的标题String new_text = webDriver.findElement(By.cssSelector("#blogDiv > div:nth-child(5) > div.title")).getText();//校验已发布博客的时间sleep(3000);String new_time = webDriver.findElement(By.cssSelector("#blogDiv > div:nth-child(5) > div.date")).getText();Assertions.assertEquals("111",new_text);Assertions.assertEquals("2024-03-13",new_time);if(new_time.contains("2024-03-12")){System.out.println("测试通过");}else{System.out.println("测试不通过");System.out.println(new_time);}}

测试结果如下:

2.7”查看全文“自动化测试

①在BlogCases类中添加blogDetail()方法

②在这个界面下分别对打开网页是否正常、点击”查看全文“按钮是否可以正常跳转进行测试

 ③使用Order注解指定测试顺序,否则可能会因为执行顺序不对导致测试失败

代码和详细注释如下:

@Order(5)@ParameterizedTest
@MethodSource("Generator")void blogDetail(String expected_url,String expected_blog_titile,String expected_title) throws InterruptedException {webDriver.get("http://122.51.27.48:8080/list.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//找到第一篇博客对应的查看全文按钮webDriver.findElement(By.cssSelector("#blogDiv > div:nth-child(1) > div.viewRow > a")).click();sleep(3000);//获取当前页面的url+校验String cur_url = webDriver.getCurrentUrl();System.out.println(cur_url);Assertions.assertEquals(expected_url,cur_url);//获取博客标题+校验sleep(3000);String cur_blog_title=webDriver.findElement(By.cssSelector("#title")).getText();System.out.println(cur_blog_title);Assertions.assertEquals(expected_blog_titile,cur_blog_title );if(cur_url.contains("cur_blog_title")){System.out.println("测试通过");}else{System.out.println("测试不通过");}//获取当前页面title(博客详情页)+校验String cur_title = webDriver.getTitle();System.out.println(cur_title);Assertions.assertEquals(expected_title,cur_title );}

测试结果如下:

2.8”删除“自动化测试

①在BlogCases类中添加blogDeleted() 方法

②在这个界面下分别对打开网页是否正常、点击”删除“按钮是否可以正常跳转进行测试

 ③使用Order注解指定测试顺序,否则可能会因为执行顺序不对导致测试失败

“删除按钮”进行测试代码和详细注释如下:

@Order(6)// @Testvoid blogDeleted() throws InterruptedException {//获取博客列表页面webDriver.get("http://122.51.27.48:8080/list.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//点击第一篇博客的查看全文按钮webDriver.findElement(By.cssSelector("#blogDiv > div:nth-child(4) > div.viewRow > a")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//点击删除按钮webDriver.findElement(By.cssSelector("#blog > div.two > button:nth-child(2)")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.switchTo().alert().accept();sleep(3000);webDriver.switchTo().alert().accept();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);String currentUrl = webDriver.getCurrentUrl();sleep(3000);/* String text = webDriver.findElement(By.cssSelector("#blogDiv > div:nth-child(11) > div.title")).getText();//校验:返回到博客列表页面,如果第一篇博客标题不是”自动化测试“,测试通过Assertions.assertEquals("http://122.51.27.48:8080/list.html",currentUrl);Assertions.assertNotEquals("自动化测试",text);*/if(currentUrl.contains("111")){System.out.println("测试不通过");}else{System.out.println("测试通过");}
}

“删除按钮”进行测试结果如下:

2.9”注销“自动化测试

①在BlogCases类中添加Logout()方法

②在这个界面下分别对打开网页是否正常、点击”删除“按钮是否可以正常跳转进行测试

 ③使用Order注解指定测试顺序,否则可能会因为执行顺序不对导致测试失败

“注销按钮”进行测试代码和详细注释如下:

@Order(7)@Testvoid Logout() throws InterruptedException {//获取博客列表页面webDriver.get("http://122.51.27.48:8080/list.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//找到注销按钮webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
webDriver.switchTo().alert().accept();
//校验urlsleep(3000);String cur_url= webDriver.getCurrentUrl();Assertions.assertEquals(cur_url,"http://122.51.27.48:8080/login.html");//校验提交按钮WebElement element = webDriver.findElement(By.cssSelector("body > div.container > div > form > div:nth-child(4) > button"));Assertions.assertNotNull(element);}

“注销按钮”进行测试结果如下:

3.自动化测试特点与亮点

特点:

根据个人项目来设计的测试用例,然后根据测试用例使用selenium4自动化测试工具和junit5单元测试框架结合来实现web自动化测试的(功能、步骤、技术一定要明确)
 

亮点:

1.只创建一次驱动,避免每个用例重复创建驱动造成时间和资源的浪费。

2.使用参数化,保持用例的整洁,提高代码的可读性。
3.使用隐式等待,提高了自动化运行效率,提高了自动化的稳定性。

4. 使用了JUnit5中提供的注解:避免生成过多的对象,造成资源和时间的浪费,提高了自动化的执行效率。

4. 测试中遇到的bug及原因

隐式等待有时会改变代码执行顺序出现报错,可加入强制等待,确保页面加载完成,提高自动化的稳定性。

三、完整测试代码链接枭a/个人博客(测试)icon-default.png?t=N7T8https://gitee.com/owl-a/personal-blog---test

四、博客系统访问链接Documenticon-default.png?t=N7T8http://122.51.27.48:8080/login.html

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

liteIDE 解决go root报错 go: cannot find GOROOT directory: c:\go

liteIDE环境配置 我使用的liteIDE为 x36 5.9.5版本 。在查看–>选项 中可以看到 LiteEnv&#xff0c;双击LiteEnv &#xff0c;在右侧选择对应系统的env文件&#xff0c;我的是win64系统&#xff0c;所以文件名为win64.env 再双击 win64.env &#xff0c;关闭当前窗口&…

Linux内核编译(版本6.0以及版本v0.01)并用qemu驱动

系统环境&#xff1a; ubuntu-22.04.1-desktop-amd64 目标平台: x86 i386 内核版本: linux-6.0.1 linux-0.0.1 环境配置 修改root密码 sudo passwd 修改软件源&#xff08;非必要&#xff09; vmtools安装&#xff08;实现win-linux软件互传&#xff09; 安装一些必须的软件&…

DevOps本地搭建笔记(个人开发适用)

需求和背景 win11 wsl2 armbian(玩客云矿渣&#xff09;&#xff0c;构建个人cicd流水线&#xff0c;提高迭代效率。 具体步骤 基础设施准备 硬件准备&#xff1a;一台笔记本&#xff0c;用于开发和构建部署&#xff0c;一台服务器&#xff0c;用于日常服务运行。 笔记本…

Celery知识

celery介绍 # celery 的概念&#xff1a; * 翻译过来是芹菜 * 官网&#xff1a;https://docs.celeryq.dev/en/stable/ # 是分布式的异步任务框架&#xff1a; 分布式&#xff1a;一个任务&#xff0c;拆成多个任务在不同机器上做 异步任务&#xff1a;后台执行…

【Greenhills】MULTIIDE集成第三方的编辑器进行源文件编辑工作

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 在使用GHS进行工作的时候&#xff0c;可以集成第三方的编辑器进行源文件编辑工作 2、 问题场景 用于解决在GHS中进行项目开发时&#xff0c;对于GHS的编辑器使用不习惯&#xff0c;想要切换到其他第三方的编辑…

漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助

知识点 1、插件类-武装BurpSuite-漏洞检测&分析辅助 2、插件类-武装谷歌浏览器-信息收集&情报辅助 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动漏扫&联动漏扫 Poc开发-Ymal语…

Qt QDateTime类使用

一.Qt datetime 介绍 Qt中的QDateTime类是用于处理日期和时间的组合的类&#xff0c;它提供了丰富的功能来操作和格式化日期时间数据。以下是其主要特点和用法&#xff1a; 构造函数&#xff1a;QDateTime可以通过组合QDate&#xff08;日期&#xff09;和QTime&#xff08;时…

TypeScript编译选项

编译单个文件&#xff1a;终端 tsc 文件名 自动编译单个文件&#xff1a;终端 tsc 文件名 -w 编译整个项目&#xff1a;tsc 前提是得有ts的配置文件tsconfig.json 自动编译整个项目&#xff1a;tsc --w tsconfig.json默认文件内容&#xff1a; tsconfig.json是ts编译器的配…

阿里云服务器Ngnix配置SSL证书开启HTTPS访问

文章目录 前言一、SSL证书是什么&#xff1f;二、如何获取免费SSL证书三、Ngnix配置SSL证书总结 前言 很多童鞋的网站默认访问都是通过80端口的Http服务进行访问&#xff0c;往往都会提示不安全&#xff0c;很多人以为Https有多么高大上&#xff0c;实际不然&#xff0c;他只是…

C库函数-getopt函数总结学习

1、简介 getopt函数是命令行参数解析函数 1、1命令行组成 Command name 程序文件名 operands 操作对象 option 选项 option argument 选项参数 getopt()函数将传递给mian()函数的argc,argv作为参数&#xff0c;同时接受字符串参数optstring – optstring是由选项Option字母组…

前端Vue列表组件 list组件:实现高效数据展示与交互

前端Vue列表组件 list组件&#xff1a;实现高效数据展示与交互 摘要&#xff1a;在前端开发中&#xff0c;列表组件是展示数据的重要手段。本文将介绍如何使用Vue.js构建一个高效、可复用的列表组件&#xff0c;并探讨其在实际项目中的应用。 效果图如下&#xff1a; 一、引言…

【前端】HTML常用标签

因为想当个全栈&#xff0c;所以巩固了一下HTML与CSS和JS基础&#xff0c;这一篇博客是HTML部分 文章目录 HTML 基础标签 1HTML 基础框架HTML 基础标签语义标签文本格式化标签div 与 span 标签图像标签超链接特殊字符 基础标签 2 | 表格表格的使用表格标签表格属性表格的头部与…

利用tree命令自动保存文件层级结构

tree命令的使用 为了将上图左侧的文件目录&#xff0c;生成上图右侧中的文件夹结构列表&#xff0c;保存在txt中&#xff0c;使用了如下cmd命令&#xff1a; C:\armadillo-12.8.0>tree .>list.txt以上tree命令分为3部分&#xff1a; tree 命令. 在当前目录>list.tx…

JavaEE:网络编程

网络编程&#xff1a;通过代码完成基于网络的跨主机通信 跨主机通信方式&#xff1a; 1.TCP/IP网络 2.蓝牙通信 3.近场通信NFC 4.毫米波通信&#xff1a;功率高&#xff0c;带宽高&#xff0c;抗干扰能力差 其中TCP/IP网络是日常编程中最常涉及到的&#xff0c;最通用的跨主机通…

docker私有仓库-harbor的搭建

docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker di…

Java项目:基于springboot实现的OA协同办公系统(源码+数据库+毕业论文)

一、项目简介 本项目是一套基于Springbootvue实现的付费自习室系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

Processing基本形状内容和实例

一、Processing的基本形状内容和实例 1.Processing有一组专门绘制基本图形得图案。像线条这样的基本图形可以被连接起来创建更为复杂得形状&#xff0c;例如一片叶子或者一张脸。 2.为了绘制一条直线&#xff0c;我们需要四个参数&#xff0c;两个用于确定初始位置&#xff0c;…

Xterminal:未来的终端体验

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

【vue.js】文档解读【day 4】 | 事件处理

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 事件处理前言监听事件内联事件处理器方法事件处理器方法与内联事件判断在内联处理器中调用方法在内联事件处理器中访问事件参数修饰符事件修饰符按键修饰符常规按键别名系统按键别名组合按键ex…

(C语言)strcpy与strcpy详解,与模拟实现

目录 1. strcpy strcpy模拟实现&#xff1a; 实现方法1&#xff1a; 实现方法2&#xff1a; 2. strcat strcat模拟实现&#xff1a; 1. strcpy 作用&#xff1a;完成字符串的复制。 头文件&#xff1a;<string.h> destination是字符串要复制到的地点&#xff0c;s…