个人博客项目测试报告

news2024/11/26 15:49:50

目录

一. 项目背景

二. 概述

三. 功能测试用例

四. 自动化测试用例


一. 项目背景

项目链接: http://81.70.189.104:8080/login.html

个人博客系统提供了 登录、注册、写博客&发布博客、删除博客、修改博客功能。前端的页面有 登录页、注册页、个人博客列表页、博客详情页、博客列表页(覆盖所有用户文章)。

二. 概述

该测试报告主要对项目的主流程进行测试,分别是注册功能、登录功能、查看全文功能、修改功能、删除功能、发布文章功能、对列表页中的按钮进行测试。

三. 功能测试用例

四. 自动化测试用例

设计到的技术 Junit3,selenium。

测试环境:使用 windows11系统、Chrom浏览器。

测试数据:

// 该类用来做一些初始化操作
public class InitAndEnd {
    static WebDriver webDriver;
    public int a;
    @BeforeAll
    static void Setup() {
        webDriver = new ChromeDriver();
    }
    @AfterAll
    static void TearDown() {
        webDriver.quit();
    }
}

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogCases extends InitAndEnd{
    public static Stream<Arguments> registerTestSuccess1() {
        return Stream.of(Arguments.arguments(
                "m1",
                "m1"
        ));
    }

    public static Stream<Arguments> registerTestFailArg() {
        return Stream.of(Arguments.arguments(
                "admin",
                "admin"
        ));
    }

    /**
     * 输入正确的账号与密码 => 登录成功
     */
    @Order(1)
    @ParameterizedTest
    @CsvFileSource(resources = "LoginSuccess.csv")
    void loginSuccessTest(String username, String password, String blogListUrl) throws InterruptedException {
        // 先打开博客登录页面
        webDriver.get("http://81.70.189.104:8080/login.html");
        // 输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击提交登录按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 隐式等待
//        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.urlContains(blogListUrl));
        // 跳转到列表页
        // 判断 URL地址
        String curURL = webDriver.getCurrentUrl();
        Assertions.assertEquals(blogListUrl,curURL);
    }
    /**
     * 输入错误的账号与密码 ==>登录失败
     */
    @Order(2)
    @ParameterizedTest
    @CsvFileSource(resources = "loginFail.csv")
    void loginFailTest(String username, String password, String loginUrl) throws InterruptedException {
        webDriver.get("http://81.70.189.104:8080/login.html");
        // 输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击提交登录按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 隐式等待
//        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.alertIsPresent());
        // alert 弹窗处理
        webDriver.switchTo().alert().accept();
        // 判断 URL地址
        String curURL = webDriver.getCurrentUrl();
        Assertions.assertEquals(loginUrl,curURL);
    }

    /**
     *  该方法来校验个人博客的列表页
     */
    @Order(3)
    @Test
    void myBlogListTest() throws InterruptedException {
        // 打开博客列表页
        webDriver.get("http://81.70.189.104:8080/myblog_list.html");
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 获取页面上所有的博客标题对应的元素
        List<WebElement> elements = webDriver.findElements(By.cssSelector(".title"));
        // 校验个数是否为 0
        Assertions.assertNotEquals(0,elements.size());
        // 获取第一篇文章的简介内容
        WebElement element = webDriver.findElement(By.cssSelector(".desc"));
        Assertions.assertNotEquals("",element.getText());
    }

    /**
     * 判断文章详情
     */
    @Order(4)
    @Test
    void myBlogList_contentTest() {
        // 打开博客列表页
        webDriver.get("http://81.70.189.104:8080/myblog_list.html");
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 获取到第一篇博客的时间
        String expectTime = webDriver.findElement(By.cssSelector(".date")).getText();
        // 获取到第一排呢博客的标题
        String expectTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();
        // 点击第一篇博客的查看全文
        webDriver.findElement(By.cssSelector(".detail")).click();
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_content.html?aid=6"));
        // 校验当前的页面的 URL
        Assertions.assertEquals("http://81.70.189.104:8080/blog_content.html?aid=6",webDriver.getCurrentUrl());
        // 校验时间
        String actualTime = webDriver.findElement(By.cssSelector("#createtime")).getText();
        Assertions.assertEquals(expectTime,actualTime);
        // 校验文章标题
        String actualTitle = webDriver.findElement(By.cssSelector("#title")).getText();
        Assertions.assertEquals(expectTitle,actualTitle);
    }

    /**
     * 测试列表页功能 (查看文章,首页,上一页,下一页,尾页)
     */
    @Order(5)
    @Test
    void ListTest() {
        // 打开博客列表页
        webDriver.get("http://81.70.189.104:8080/myblog_list.html");
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 点击主页跳转到 列表页
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_list.html"));
        // 校验当前页面的 URL
        Assertions.assertEquals("http://81.70.189.104:8080/blog_list.html",webDriver.getCurrentUrl());
        // 校验列表页上的文章标题和时间 与 详情页中的标题和时间
        String expectTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();
        String expectTime = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.date")).getText();
        // 跳转到博客详情页
        webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a")).click();
        // 显示等待
        wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_content.html?aid=7"));

        String actualTitle = webDriver.findElement(By.cssSelector("#title")).getText();
        String actualTime = webDriver.findElement(By.cssSelector("#createtime")).getText();
        Assertions.assertEquals(expectTime,actualTime);
        Assertions.assertEquals(expectTitle,actualTitle);
        // 浏览器返回
        webDriver.navigate().back();
        // 显示等待
        wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_list.html"));

        // 测试按钮
        // 点击首页
        webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)")).click();
        // 处理 alert 弹窗
        webDriver.switchTo().alert().accept();
        // 点击下一页
        webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(3)")).click();
        // 校验当前页面 URL
        Assertions.assertEquals("http://81.70.189.104:8080/blog_list.html?pindex=2",webDriver.getCurrentUrl());
        // 点击上一页
        webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(2)")).click();
        // 校验当前页面 URL
        Assertions.assertEquals("http://81.70.189.104:8080/blog_list.html?pindex=1",webDriver.getCurrentUrl());
        // 点击尾页
        webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)")).click();
        // 校验当前页面 URL
        Assertions.assertEquals("http://81.70.189.104:8080/blog_list.html?pindex=3",webDriver.getCurrentUrl());
    }

    /**
     * 发布博客
     */
    @Order(6)
    @Test
    void addBlogTest() throws InterruptedException {
        webDriver.get("http://81.70.189.104:8080/myblog_list.html");
        // 显示等待 myblog_list.html
        WebDriverWait wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/myblog_list.html"));
        // 点击写博客按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        // 隐式等待 blog_add.html
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 编写博客
        // 写标题
//        ((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
        webDriver.findElement(By.cssSelector("#title")).sendKeys("自动化测试");
        // 点击发布按钮
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理 alert 弹窗
        webDriver.switchTo().alert().dismiss();
        // 显示等待
        wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/myblog_list.html"));
        // 校验当前 URL
        Assertions.assertEquals("http://81.70.189.104:8080/myblog_list.html",webDriver.getCurrentUrl());
        // 校验第一篇博客
        // 校验文章标题
        String actualTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();
        Assertions.assertEquals("自动化测试",actualTitle);
    }

    /**
     * 修改博客
     */
    @Order(7)
    @Test
    void editBlogTest() throws InterruptedException {
        webDriver.get("http://81.70.189.104:8080/myblog_list.html");
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 点击修改按钮
        webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(5)")).click();
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);
        // 修改文章标题
        // 清空标题
        webDriver.findElement(By.cssSelector("#title")).clear();
        // 编写标题
        webDriver.findElement(By.cssSelector("#title")).sendKeys("修改");
        // 点击修改文章按钮
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).sendKeys(Keys.CONTROL,"X");
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        WebDriverWait wait = new WebDriverWait(webDriver,3);
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理 alert 弹窗
        webDriver.switchTo().alert().accept();
        // 显示等待
        wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/myblog_list.html"));
        // 校验第一篇文章的标题
        String actualTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();
        Assertions.assertEquals("修改",actualTitle);
    }

    /**
     * 删除博客
     */
    @Order(8)
    @Test
    void deleteBlogTest() {
        webDriver.get("http://81.70.189.104:8080/myblog_list.html");
        // 点击删除按钮
        webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理 alert 弹窗
        // 取消删除
        webDriver.switchTo().alert().dismiss();
        // 点击删除按钮
        webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();
        // 显示等待
        wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.alertIsPresent());
        // 确定删除
        webDriver.switchTo().alert().accept();
        // 显示等待
        wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理删除成功的 alert
        webDriver.switchTo().alert().accept();
        // 校验第一个文章标题
        Assertions.assertNotEquals("修改",webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText());
    }

    /**
     * 注销博客
     */
    @Order(9)
    @Test
    void loginOutTest() {
        webDriver.get("http://81.70.189.104:8080/myblog_list.html");
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);
        // 点击注销按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,6);
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理 alert 弹窗
        // 点击取消
        webDriver.switchTo().alert().dismiss();
        // 点击注销按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        // 显示等待
        wait = new WebDriverWait(webDriver,6);
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理 alert 弹窗
        webDriver.switchTo().alert().accept();
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(6,TimeUnit.SECONDS);
        // 校验当前页面的 URL
        Assertions.assertEquals("http://81.70.189.104:8080/login.html",webDriver.getCurrentUrl());
        // 校验 用户与密码输入框是否为空
        Assertions.assertEquals("",webDriver.findElement(By.cssSelector("#username")).getText());
        Assertions.assertEquals("",webDriver.findElement(By.cssSelector("#password")).getText());
    }

    /**
     * 注册测试
     */
    @Disabled
    @Order(10)
    @ParameterizedTest
    @MethodSource("registerTestSuccess1")
    void registerTestSuccess(String username, String password) {
        webDriver.get("http://81.70.189.104:8080/login.html");
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 点击注册按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/reg.html"));
        // 校验当前页面 URL
        Assertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 输入确认密码
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(password);
        // 点击提交
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 显示等待
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理 alert 弹窗
        webDriver.switchTo().alert().accept();
        // 显示等待
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/login.html"));
        // 校验当前页面的 URL 地址
        Assertions.assertEquals("http://81.70.189.104:8080/login.html",webDriver.getCurrentUrl());
    }

    @Order(11)
    @ParameterizedTest
    @MethodSource("registerTestFailArg")
    void registerTestFailTest(String username, String password) {
        webDriver.get("http://81.70.189.104:8080/login.html");
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 点击注册按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        // 显示等待
        WebDriverWait wait = new WebDriverWait(webDriver,5);
        wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/reg.html"));
        // 校验当前页面 URL
        Assertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 输入确认密码
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(password);
        // 点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 显示等待
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理注册失败的弹窗 alert
        webDriver.switchTo().alert().accept();
        // 校验页面 URL
        Assertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());

        // 刷新当前页面
        webDriver.navigate().refresh();
        // 隐式等待
        webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);
        // 密码 与 确认密码不同
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys("ppp");
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password+"123");
        // 输入确认密码
        webDriver.findElement(By.cssSelector("#password2")).sendKeys(password);
        // 点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 显示等待
        wait.until(ExpectedConditions.alertIsPresent());
        // 处理弹窗
        webDriver.switchTo().alert().accept();
        Assertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());
    }


}

部分展示图:

登录页面:

个人列表页:

博客详情页: 

博客列表页:

博客编辑页:

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

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

相关文章

使用docker容器内的anaconda虚拟环境启动python web项目

1、环境安装 1.1 基础镜像 这里以ubuntu18.04 cuda 11.8为基础镜像&#xff08;主机支持nvidia-gpu&#xff09; &#xff08;1&#xff09;拉取ubuntu18.4 cuda11.8镜像 docker pull nvidia/cuda:11.8.0-devel-ubuntu18.04 1.2 docker下anaconda安装 &#xff08;1&am…

10|山水诗词:给自己一座精神的“辋川”

好诗相伴&#xff0c;千金不换。你好&#xff0c;我是天博。 前面三讲中&#xff0c;我们在“见古今”的主题里&#xff0c;讨论了诗词中流传下来的三种精神&#xff0c;侠义精神、文人风骨和家国情怀。从这一讲开始&#xff0c;我们进入了“见天地”的主题&#xff0c;一起来…

Vue项目案例-头条新闻

目录 1.项目介绍 1.1项目功能 1.2数据接口 1.3设计思路 2.创建项目并安装依赖 2.1创建步骤 2.2工程目录结构 2.3配置文件代码 3.App主组件开发 3.1设计思路 3.2对应代码 4.共通组件开发 4.1设计思路 4.2对应代码 5.头条新闻组件开发 5.1设计思路 5.2对应代码 …

Android -BLE 蓝牙模块开发

Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码) - 简书前言 万物互联的物联网时代的已经来临&#xff0c;ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点&#xff0c;抽时间梳理下这块的知识点。 涉及ble蓝牙通讯的客户端(开启、扫描、连接…

【OLED驱动】:stm32F103的四线模拟IIC驱动的0.96寸OLED屏幕显示数字,字母,汉字,图片的例程

文章目录 前言 一、四线OLED是什么&#xff1f; 二、IIC原理 1.四线0.96寸OLED是IIC驱动来实现显示 2.IIC协议的OLED屏幕 3.STM32驱动代码 4.IIC使用代码 总结 前言 最近在做一个开源方案 — 平衡车&#xff0c;即将开源硬件和软件&#xff0c;会在CSDN上开源&#xff0…

Vue2+Vue3基础入门到实战项目(五)——课程学习笔记

大家好&#xff0c; Capybara 继续与大家一起学习Vue框架。书读百遍其义自见。 day06 路由进阶 路由模块封装 router/index.js 所抽离内容包括&#xff1a;导入组件、&#xff08;额外需要&#xff09;导入Vue、导入VueRouter插件、 创建路由对象、导出路由对象 需要注意路径…

上线检查工具(待完善)

根据V11《CEBPM系统上线CheckList》整理而得&#xff0c;适用于V11&#xff0c;DHERP&#xff0c;Oracle和MSSQL数据库&#xff0c;检查内容还不完善。 上图&#xff1a; 1&#xff09;数据库连接 2&#xff09;双击[连接别名]&#xff0c;可选择历史连接 3&#xff09;主界面…

若依 MyBatis改为MyBatis-Plus

主要内容&#xff1a;升级成mybatis-plus&#xff0c;代码生成也是mybatis-plus版本 跟着我一步一步来&#xff0c;就可完成升级&#xff01; 检查&#xff1a;启动程序&#xff0c;先保证若依能启动 第一步&#xff1a;添加依赖 这里需要在两个地方添加&#xff0c;一个是最…

CSRF攻击原理及防护

CSRF攻击原理及防护 0x01 CSRF是什么 ssrf 服务端请求伪造 CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&#xff0c;是一种网络攻击方式&#xff0c;也被称为 one-click attack 或者 session riding。 0x02 CSRF攻击原理 CSRF攻击利用网站…

flutter架构全面解析

Flutter 是一个跨平台的 UI 工具集&#xff0c;它的设计初衷&#xff0c;就是允许在各种操作系统上复用同样的代码&#xff0c;例如 iOS 和 Android&#xff0c;同时让应用程序可以直接与底层平台服务进行交互。如此设计是为了让开发者能够在不同的平台上&#xff0c;都能交付拥…

智慧公厕三大数字化远景,畅通数字化循环、夯实数字化基建、开创数字化创新

智慧公厕&#xff1a;实现数字化远景&#xff0c;提升公厕使用、建设与管理的创新之路 在现代社会中&#xff0c;公厕作为城市基础设施的重要组成部分&#xff0c;对城市形象和居民生活质量有着重要影响。然而&#xff0c;一些传统公厕管理的繁琐和配置设施的陈旧&#xff0c;…

centos7升级openssh版本

linux升级openssh版本&#xff0c;升级到8.6p1 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.下载rpm包 2.编写一键安装脚本&#xff08;然后执行&#xff09; #把所有的rpm包&#xff0c;我都放到了/ydy目录&#xff0c;下面安装时&#xff0c;也指定了这个目录 #编…

Golang-GJSON 快速而简单的方法来从 json 文档获取值

GJSON 是一个 Go 包&#xff0c;它提供了一种快速而简单的方法来从 json 文档获取值。它具有单行搜索、点符号路径、迭代和解析 json 行等功能。 GJSON 也可用于Python和Rust 入门 安装中 要开始使用GJSON 请安装 Go 并运行 go get &#xff1a; $ go get -u github.com/ti…

HarmonyOS开发:走进静态共享包的依赖与使用

前言 在上一篇&#xff0c;我们进行了动态共享包的开发和使用&#xff0c;由于动态共享包有一定的局限性&#xff0c;比如&#xff0c;调用共享包资源还得要通过工具类进行调用&#xff0c;再比如仅用于应用内部代码、资源的共享&#xff0c;如果我想要开源&#xff0c;以远程依…

STM32纯中断方式发送接收数据(串行通信;keil arm5;)

除了main文件其他文件均无修改&#xff0c;正常运行--在keil arm5内

【腾讯云Cloud Studio实战训练营】戏说cloud studio

文章目录 前言产品概述项目体验登录空间模板模板项目体验 总结 前言 在奇幻世界中&#xff0c;存在着一片神秘的云海&#xff0c;被人们称为腾讯云云端开发环境 Cloud Studio。这片云海是一座巨大的浮岛&#xff0c;上面漂浮着一个集成式开发环境&#xff08;Integrated Devel…

2023年行研行业研究报告

第一章 行业概述 1.1 行研行业 行业定义为同一类别的经济活动&#xff0c;这涉及生产相似产品、应用相同生产工艺或提供同类服务的集合&#xff0c;如食品饮料行业、服饰行业、机械制造行业、金融服务行业和移动互联网行业等。 为满足全球金融业的需求&#xff0c;1999年8月…

指针练习(2)

1. int main() {int a[5][5];int(*p)[4];p a;printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0; } 解析&#xff1a;a是一个5行5列的二维数组&#xff0c;而p是一个访问4个元素的数组指针&#xff0c;将数组a的首元素地址也…

【开发问题系列】CSV转Excel

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

innovus: 加IO buffer

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 set fid [open $net_file w] foreach port_name $input_ports { set net [get_nets -q -of_object [get_ports $port_name]] set net_name [get_attribute $net full_name] …