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

一、项目背景

    一个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)
        //获取到当前列表页url

sleep(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)
    @Test
    void 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)
    @Test
    void 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)
    @Test
    void 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)
  // @Test
    void 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)
    @Test
    void 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();
//校验url
    sleep(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue-Vben-Admin:中大型项目后台解决方案及如何实现页面反向传值

Vue-Vben-Admin&#xff1a;中大型项目后台解决方案及如何实现页面反向传值 摘要&#xff1a; Vue-Vben-Admin是一个基于Vue3.0、Vite、Ant-Design-Vue和TypeScript的开源项目&#xff0c;旨在为开发中大型项目提供一站式的解决方案。它涵盖了组件封装、实用工具、钩子函数、动…

Python逆向:pyc字节码转py文件

一、 工具准备 反编译工具&#xff1a;pycdc.exe 十六进制编辑器&#xff1a;010editor 二、字节码文件转换 在CTF中&#xff0c;有时候会得到一串十六进制文件&#xff0c;通过010editor使用查看后&#xff0c;怀疑可能是python的字节码文件。 三、逆向反编译 将010editor得到…

链路聚合实验(思科)

华为设备参考&#xff1a; 一&#xff0c;技术简介 网络设备的链路聚合技术&#xff08;Link Aggregation&#xff09;是一种将多个物理链路捆绑在一起&#xff0c;形成一个逻辑链路的技术。这样做可以增加带宽、提高可靠性和实现负载均衡。 二&#xff0c;实验目的 橙色的阻…

使用Sourcetree推送本地仓库至远程仓库时报错The host key is not cached for this server

原因是SSH没配置好 点击工具→选项→ 改成OpenSSH&#xff0c;密钥改成配置Git和本地仓库时生成的.ssh文件夹下的id_rsa文件。

Spring boot 集成netty实现websocket通信

一、netty介绍 Netty 是一个基于NIO的客户、服务器端的编程框架&#xff0c;使用Netty 可以确保你快速和简单的开发出一个网络应用&#xff0c;例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程&#xff0c;例如&#xff1a;基于TCP和U…

力扣-[700. 二叉搜索树中的搜索]

递归法 确定递归函数的参数和返回值 递归函数的参数传入的就是根节点和要搜索的数值&#xff0c;返回的就是以这个搜索数值所在的节点。 代码如下&#xff1a; public TreeNode searchBST(TreeNode root, int val) 确定终止条件 如果root为空&#xff0c;返回null&#xff0c…

【前端】HTML常用标签

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

JavaEE:网络编程

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

蓝桥杯 2022 dp 背包

蓝桥杯 2022 dp 背包 题目链接&#xff1a; https://www.lanqiao.cn/problems/2186/learning/?subject_code1&group_code4&match_num13&match_flow2&origincup 题目&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#defi…

代码随想录算法训练营第七天| 454.四数相加II、383.赎金信、15.三数之和、18.四数之和

系列文章目录 目录 系列文章目录454.四数相加II使用HashMap法 383.赎金信哈希解法&#xff08;数组&#xff09; 15.三数之和双指针法 18.四数之和双指针法 454.四数相加II 题解&#xff1a;该题和1.两数之和的方法是一样的&#xff0c;这个题的难点在于key和value分别是什么。…

网络建设与运维培训介绍和能力介绍

1.开过的发票 3.培训获奖的证书 4合同签署 5.实训设备

垃圾回收器介绍

java堆内存结构包括&#xff1a;新生代和老年代&#xff0c;其中新生代由一个伊甸区和2个幸存区组成&#xff0c;2个幸存区是大小相同&#xff0c;完全对称的&#xff0c;没有任何差别。我们把它们称为S0区和S1区&#xff0c;也可以称为from区和to区。 JVM的垃圾回收主要是针对…

Spring具体拓展点:后置处理器

一图胜千言 mermaid示例图&#xff1a; #mermaid-svg-YEqFb5JcEk5FWkwO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-icon{fill:#552222;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-text{fi…

详细分析Mysql中的LOCATE函数(附Demo)

目录 1. 基本概念2. Demo3. 实战 1. 基本概念 LOCATE()函数在SQL中用于在字符串中查找子字符串的位置 它的一般语法如下&#xff1a; LOCATE(substring, string, start)LOCATE()函数返回子字符串在主字符串中第一次出现的位置 如果未找到子字符串&#xff0c;则返回0 具体的…

stm32学习笔记:SPI通信协议原理(未完)

一、SPI简介(serial Peripheral Interface&#xff08;串行 外设 接口&#xff09;) 1、电路模式&#xff08;采用一主多从的模式&#xff09;、同步&#xff0c;全双工 1 所有SPI设备的SCK、MOSI、MISO分别连在一起 2 主机另外引出多条SS控制线&#xff0c;分别接到各从机的S…

数据集成工具 ---- datax 3.0

1、datax: 是一个异构数据源离线同步工具&#xff0c;致力于实现关系型数据库&#xff08;mysql、oracle等&#xff09;hdfs、hive、hbase等各种异构数据源之间的数据同步 2、参考网址文献&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.mdhttps:/…

代码随想录算法训练营Day46 ||leetCode 139.单词拆分 || 322. 零钱兑换 || 279.完全平方数

139.单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() 1, false);dp[0] true;for (int i 1; i < s.size(); …

【Linux】-Linux下的软件商店yum工具介绍(linux和windows互传文件仅仅一个拖拽搞定!!!!)

目录 1.Linux 软件包管理器yum 1.1快速认识yum 1.2 yumz下载方式&#xff08;如何使用yum进行下载&#xff0c;注意下载一定要是root用户或者白名单用户&#xff08;可提权&#xff09;&#xff09; 1.2.1下载小工具rzsz 1.2.2 rzsz使用 1.2.2查看软件包 1.3软件的卸载 2.yum生…

三、HarmonyOS 应用开发入门之运行Hello World

目录 1、课程对象 1.1、有移动端开发经验 1.2、无移动端开发经验 1.3、对 HarmonyOS 感兴趣 2、DevEco Studio 的使用 2.1、DevEco Studio 的关键特性 智能代码编辑 低代码开发 多段双向实时预览 多端模拟仿真 2.2、安装配置 DevEco Studio 2.2.1、官网开发工具下载地…

蓝桥杯真题讲解:三国游戏(贪心)

蓝桥杯真题讲解&#xff1a;三国游戏&#xff08;贪心&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;三国游戏&#xff08;贪心&#xff09; 二、正解代码 //三国游戏&#xff1a;贪心 #include<bits/stdc.h> #define int long lon…