【博客系统UI自动化测试报告】

博客系统UI自动化测试报告

  • 一、项目背景
  • 二、测试内容
    • (一)测试用例
    • (二)测试账号
    • (三)使用Selenium进行Web自动化测试
      • 1.环境搭建
      • 2.创建浏览器驱动
      • 3.编写博客登陆模块的测试用例代码
      • 4.编写博客主页展示模块的测试用例代码
      • 5.编写博客创作模块的测试用例代码
      • 6.编写博客查看模块的测试用例代码
      • 7.编写博客删除模块的测试用例代码
      • 8.编写博客退出模块的测试用例代码
      • 9.编写测试截图功能
      • 10.整合代码,进行系统测试
  • (三)自动化测试总结
    • 1.自动化测试覆盖模块
    • 2.自动化测试用例数量
    • 3. 自动化测试代码展示
    • 4.自动化测试部分截图
    • 5. 自动化测试结果
    • 6. 测试评估
    • 7. 遗留问题
  • 总结


一、项目背景

本次博客系统UI自动化测试所用博客系统是基于SSM框架实现的个人博客系统,由博客登陆页、博客主页页、博客创作页、博客详情页所组成。成功登录博客即可查看自己已发布的博客,也可以进行发布博客操作,通过使用Selenium定位web元素、对获取到的元素进行操作等,对个人博客系统进行测试,测试的核心内容包括博客登录、博客主页展示、博客创作、博客修改、博客查看、博客删除、博客退出等。同时该博客系统还可以实现记录博客发布日期、时间等信息。

二、测试内容

注:测试的内容都是个人完成的,所以就不写需求文档和测试安排了。

(一)测试用例

设计测试用例方法一般从以下几个方面设计:

功能测试、界面测试、性能测试、易用性测试、安全性测试、兼容性测试等六个方面进行设计,但是个人博客系统是一个web网站,主要是针对核心功能、界面测试、安全性测试、兼容性测试进行测试,编写的测试用例如下:
在这里插入图片描述
其中安全性测试和界面测试需要人工测试,就不过多涉及了,
本报告主要对功能模块进行自动化测试。

(二)测试账号

账号用户名密码
账号1zhangsan123456
账号2lisi123456

(三)使用Selenium进行Web自动化测试

1.环境搭建

安装与浏览器名称和版本对应的webdrivermanager。
本次测试使用的驱动版本如下:

驱动版本
Edge浏览器138.0.3351.121 (正式版本) (64 位)
selenium4.0.0
webdriver-manager4.0.2

在这里插入图片描述

2.创建浏览器驱动

创建一个驱动类(自定义名为Edge_Driver),通过在Edge_Driver中创建一个统一驱动对象对博客登录、博客主页展示、博客创作、博客修改、博客查看、博客删除、博客退出等功能分别进行测试操作。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Optionsclass Edge_Driver:driver=""def __init__(self):# EdgeDriver 路径edge_driver_path = r"C:\Program Files (x86)\Microsoft\Edge\WebDriver\edgedriver_win64\msedgedriver.exe"service=Service(edge_driver_path)options = Options()options.add_argument("--remote-allow-origins=*")self.driver=webdriver.Edge(service=service,options=options)self.driver.implicitly_wait(2)

注:根据所要测试的功能可创建不同的测试类

3.编写博客登陆模块的测试用例代码

(1)创建一个博客登陆测试类(自定义名为BlogLand)继承Edge_Driver类,得到驱动driver

(2)根据博客登陆模块测试用例创建不同的方法

	land.LandFailTest1()#输入错误的账号和错误的密码land.LandFailTest2()#输入错误的账号和正确的密码land.LandFailTest3()#输入正确的账号和错误的密码land.LandFailTest4()#输入非常规账号和密码land.LandFailTest5()#仅输入账号land.LandFailTest6()#仅输入密码land.LandFailTest7()#不做输入land.LandTest()#输入正确的账号和密码 
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import alert_is_present
from common.webdriver import BlogDriver
class BlogLand:url=""driver=""def __init__(self):self.url = "http://8.137.19.140:9090/blog_login.html"self.driver = BlogDriver.driver#登陆成功def LandTest1(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR,"#username").clear()self.driver.find_element(By.CSS_SELECTOR,"#password").clear()self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()BlogDriver.GetImage()text=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").textassert text=='zhangsan'self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()def LandTest2(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()BlogDriver.GetImage()text = self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3").textassert text == 'lisi'self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()#输入错误的账号和错误的密码def LandFailTest1(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR,"#username").clear()self.driver.find_element(By.CSS_SELECTOR,"#password").clear()self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhannsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123457")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='用户不存在'alert.accept()BlogDriver.GetImage()#输入错误的账号和正确的密码def LandFailTest2(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhanasan")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='用户不存在'alert.accept()BlogDriver.GetImage()#输入正确的账号和错误的密码def LandFailTest3(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("122456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='密码错误'alert.accept()BlogDriver.GetImage()#输入非常规账号和密码def LandFailTest4(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("$@:zda85545><?~")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("$@:zda85545><?~")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='用户不存在'alert.accept()BlogDriver.GetImage()#仅输入账号def LandFailTest5(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='账号或密码不能为空'alert.accept()BlogDriver.GetImage()#仅输入密码def LandFailTest6(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.implicitly_wait(2)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='账号或密码不能为空'alert.accept()BlogDriver.GetImage()#不做输入def LandFailTest7(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.implicitly_wait(2)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='账号或密码不能为空'alert.accept()BlogDriver.GetImage()land = BlogLand()

(3)单独对该模块进行自动化测试

4.编写博客主页展示模块的测试用例代码

(1)创建一个博客主页展示类(自定义名为BlogShow)继承Edge_Driver类,得到驱动driver

(2)根据博客主页展示模块测试用例创建不同的方法

	LandShow()#登陆状态下主页展示LandFailShow()#未登录状态主页展示
import time
from selenium.webdriver.common.by import By
from common.webdriver import BlogDriverclass BlogShow:url = ""driver=""def __init__(self):self.url = "http://8.137.19.140:9090/blog_login.html"self.driver=BlogDriver.driverself.driver.get(self.url)#登陆状态下主页展示def LandShow(self):self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()BlogDriver.GetImage()text=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").textassert  text=="zhangsan"text=self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > span").textassert text =="我的博客系统"text=self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").textassert text =="注销"text=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > div:nth-child(4) > span:nth-child(1)").textassert text =="文章"text=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > div:nth-child(4) > span:nth-child(2)").textassert text =="分类"#未登录状态主页展示def LandFailShow(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(4)").click()time.sleep(1)self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()time.sleep(1)BlogDriver.GetImage()# text=self.driver.find_element(By.CSS_SELECTOR,"#submit").text# print(text)# assert  text =="发布文章"self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='账号或密码不能为空'alert.accept()BlogDriver.GetImage()Show = BlogShow()

(3)单独对该模块进行自动化测试

5.编写博客创作模块的测试用例代码

(1)创建一个博客创作展示类(自定义名为BlogPush)继承Edge_Driver类,得到驱动driver

(2)根据博客创作模块测试用例创建不同的方法

	BPush()#博客创作Modify()#博客修改
from common.webdriver import BlogDriver
import timefrom selenium.webdriver.common.by import Byclass BlogPush:driver=""url=""def __init__(self):self.driver=BlogDriver.driverself.url="http://8.137.19.140:9090/blog_login.html"# 博客创作def BPush(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()time.sleep(1)BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)alert=self.driver.switch_to.alertalert.accept()self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("博客系统UI自动化测试")BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()# 博客修改def Modify(self):self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > a").click()time.sleep(1)BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(1)").click()BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("123")BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()push=BlogPush()

(3)单独对该模块进行自动化测试

6.编写博客查看模块的测试用例代码

(1)创建一个博客查看展示类(自定义名为BlogFind)继承Edge_Driver类,得到驱动driver

(2)根据博客查看模块测试用例创建不同的方法

#博客查看
LandFind():
from common.webdriver import BlogDriver
import timefrom selenium.webdriver.common.by import Byclass BlogFind:url=""driver=""def __init__(self):self.url = "http://8.137.19.140:9090/blog_login.html"self.driver=BlogDriver.driver#博客查看def LandFind(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > a").click()text=self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.title").textBlogDriver.GetImage()assert  text=='博客系统UI自动化测试123'text=self.driver.find_element(By.CSS_SELECTOR, "#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2").textassert  text=='在这里写下一篇博客'self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)").click()find=BlogFind()

(3)单独对该模块进行自动化测试

7.编写博客删除模块的测试用例代码

(1)创建一个博客删除类(自定义名为BlogPop)继承Edge_Driver类,得到驱动driver

(2)根据博客删除博客删除模块测试用例创建不同的方法

BPop()#博客删除
import timefrom selenium.webdriver.common.by import Byfrom common.webdriver import BlogDriverclass BlogPop:driver=""url=""def __init__(self):self.driver=BlogDriver.driverself.url="http://8.137.19.140:9090/blog_login.html"def BPop(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > a").click()time.sleep(1)BlogDriver.GetImage()self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(2)").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='确定删除?'alert.dismiss()self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(2)").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='确定删除?'alert.accept()BlogDriver.GetImage()pop=BlogPop()

(3)单独对该模块进行自动化测试

8.编写博客退出模块的测试用例代码

(1)创建一个博客退出类(自定义名为BlogExit)继承Edge_Driver类,得到驱动driver

(2)根据博客退出模块测试用例创建不同的方法
注:博客正常退出在前几个模块不断被使用,故这里只编写了不正常退出。

BExit()#博客不正常退出
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Servicefrom common.webdriver import BlogDriverclass BlogExit:driver=""url=""def __init__(self):self.url="http://8.137.19.140:9090/blog_login.html"self.driver=BlogDriver.driverdef BExit(self):self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()self.driver.quit()edge_driver_path = r"C:\Program Files (x86)\Microsoft\Edge\WebDriver\edgedriver_win64\msedgedriver.exe"service=Service(edge_driver_path)options = Options()options.add_argument("--remote-allow-origins=*")self.driver=webdriver.Edge(service=service,options=options)self.driver.get(self.url)self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(1)alert = self.driver.switch_to.alerttext=alert.textassert text=='账号或密码不能为空'alert.accept()self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(1)self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)").click()time.sleep(1)self.driver.quit()exit=BlogExit()

(3)单独对该模块进行自动化测试

9.编写测试截图功能

测试截图可在自动化测试过程中进行截图操作并保存,这有利于自动化测试结果的观察。
因为该截图功能可能会被反复调用,故可以将其和创建驱动对象写到一起。

import datetime
import os
import sys
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Optionsclass Edge_Driver:driver=""def __init__(self):# EdgeDriver 路径edge_driver_path = r"C:\Program Files (x86)\Microsoft\Edge\WebDriver\edgedriver_win64\msedgedriver.exe"service=Service(edge_driver_path)options = Options()options.add_argument("--remote-allow-origins=*")self.driver=webdriver.Edge(service=service,options=options)self.driver.implicitly_wait(2)def GetImage(self):dirname = datetime.datetime.now().strftime('%Y-%m-%d')if not os.path.exists("../images/" + dirname):os.mkdir("../images/" + dirname)filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"self.driver.save_screenshot("../images/" + dirname + "/" + filename)BlogDriver=Edge_Driver()

10.整合代码,进行系统测试

将前面写的代码都放入main函数中运行。

from auto_Chrome_bolgtest import EdgeBlogLand
from auto_Chrome_bolgtest import EdgeBlogShow
from auto_Chrome_bolgtest import EdgeBlogFind
from auto_Chrome_bolgtest import EdgeBlogPush
from auto_Chrome_bolgtest import EdgeBlogPop
from auto_Chrome_bolgtest import EdgeBlogExitif __name__=="__main__":#博客登陆EdgeBlogLand.land.LandFailTest1()#输入错误的账号和错误的密码EdgeBlogLand.land.LandFailTest2()#输入错误的账号和正确的密码EdgeBlogLand.land.LandFailTest3()#输入正确的账号和错误的密码EdgeBlogLand.land.LandFailTest4()#输入非常规账号和密码EdgeBlogLand.land.LandFailTest5()#仅输入账号EdgeBlogLand.land.LandFailTest6()#仅输入密码EdgeBlogLand.land.LandFailTest7()#不做输入EdgeBlogLand.land.LandTest1()#输入正确的账号和密码EdgeBlogLand.land.LandTest2()  # 输入正确的账号和密码#博客主页展示EdgeBlogShow.Show.LandShow()EdgeBlogShow.Show.LandFailShow()#博客创作EdgeBlogPush.push.BPush()EdgeBlogPush.push.Modify()#博客查看EdgeBlogFind.find.LandFind()#博客删除EdgeBlogPop.pop.BPop()#博客退出EdgeBlogExit.exit.BExit()

(三)自动化测试总结

1.自动化测试覆盖模块

博客登录、博客主页展示、博客创作、博客修改、博客查看、博客删除、博客退出

2.自动化测试用例数量

	自动化测试用例数量:33个

3. 自动化测试代码展示

博客UI自动化测试代码链接:
https://gitee.com/pluck-his-hair/primary-project/tree/master/auto_test

4.自动化测试部分截图

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

5. 自动化测试结果

        项目功能用例99.999999%通过

6. 测试评估

核心功能测试通过,项目达到上线基本要求

7. 遗留问题

问题预期结果实际结果遗留原因
博客主页展示页面中文章数量跟随博客数量的变动而进行改变始终为2测试时间紧张,留至下版本更新处理
博客主页GitHub 地址能显示且能跳转不能显示但能跳转测试时间紧张,留至下版本更新处理
部分扩展功能测试抓紧实现暂未实现测试时间紧张,未能涉及全模块

总结

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

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

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

相关文章

简单手写Transformer:原理与代码详解

Transformer 作为 NLP 领域的里程碑模型&#xff0c;彻底改变了序列建模的方式。它基于自注意力机制&#xff0c;摆脱了 RNN 的序列依赖&#xff0c;实现了并行计算&#xff0c;在机器翻译、文本生成等任务中表现卓越。本文将从零开始&#xff0c;手写一个简化版 Transformer&a…

Numpy科学计算与数据分析:Numpy入门之数组操作与科学计算基础

Numpy入门实践&#xff1a;从零开始掌握科学计算利器 学习目标 通过本课程的学习&#xff0c;学员将了解Numpy的历史背景、核心特点及其在科学计算中的重要性。学员将掌握如何使用Numpy进行数组操作&#xff0c;包括数组的创建、索引、切片以及基本的数学运算&#xff0c;为后…

python:讲懂决策树,为理解随机森林算法做准备,以示例带学习,通俗易懂,容易理解和掌握

为什么要讲和学习决策树呢?主要是决策树(包括随机森林算法)不需要数据的预处理。现实世界的数据往往“脏乱差”,决策树让你在数据准备上可以少花很多功夫,快速上手,用起来非常的“省心”。总之,决策树是机器学习领域里最直观易懂、解释性最强、应用最广泛的基础模型之一…

C语言:单链表学习

文件&#xff1a;main.c #include "linkedList.h"int main(int argc, char *argv[]) {// 创建头结点NODE *head NULL;// 创建链表if (llist_create(&head, 666) < 0){perror("链表创建失败&#xff01;");return -1;}// 向链表插入数据llist_addTa…

使用 decimal 包解决 go float 浮点数运算失真

文章目录问题解决注意问题 go float 在运算的时候会出现精度问题 package mainimport ("fmt" )func main() {var a float64 0.3var b float64 0.6fmt.Println("ab", ab) // 你以为是 0.9 但是结果是&#xff1a;0.8999999999999999 }你观察到的 0.3 …

MongoDB学习专题(六)复制集和分片集群

1、概念MongoDB复制集的主要意义在于实现服务高可用&#xff0c;类似于Redis中的哨兵模式2、功能1. 数据写入主节点时将数据复制到另一个副本节点上2. 主节点发生故障时自动选举出一个新的替代节点在实现高可用的同时&#xff0c;复制集实现了其他几个作用数据分发&#xff1a;…

vue3对比vue2的性能优化和提升 :Vue 3 vs Vue 2

1.性能提升 1.1.响应式系统的改进: 从 Object.defineProperty 到 Proxy Vue2:Vue 2 的响应式系统基于 Object.defineProperty,它为每个属性单独设置 getter 和 setter。虽然能够满足基本需求,但它在以下方面存在性能瓶颈: Vue2 中数组监听的局限性:Vue2 通过Object.defi…

进程生命周期管理:从创建到终止的完整逻辑

前言 在操作系统的世界里&#xff0c;进程就像一个个忙碌的 “工作单元”&#xff0c;从被创建到完成任务后终止&#xff0c;始终遵循着一套严谨的生命周期规则。理解进程的生命周期管理&#xff0c;是揭开操作系统多任务调度神秘面纱的关键 —— 而这其中&#xff0c;进程的创…

【显示器】背光板的结构和工作原理

背光板是LCD&#xff08;液晶显示器&#xff09;中的一个重要组件&#xff0c;它负责提供屏幕所需的光源。下面我们详细解释背光板的结构和工作原理。背光板的基本结构一个典型的背光板由以下几个主要部分组成&#xff1a;LED灯条&#xff1a;通常使用白色LED作为光源。导光板&…

hadoop HDFS 重置详细步骤

有时候我们需要对hdfs重置&#xff0c;步骤如下&#xff1a; 1、停止服务 2. 清除日志节点ssh dmp-hdfs-ns1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-ns2 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt2 rm -rf /disk1/dfs/jn/me…

前端性能优化:从请求到资源的精细调控

在用户体验为王的时代&#xff0c;前端性能直接决定产品的留存率。本文聚焦 “减少不必要的传输与加载损耗”&#xff0c;从 合并HTTP请求、启用压缩、减少Cookie、资源加载顺序 四个维度&#xff0c;拆解优化思路与落地方法。 一、合并HTTP请求&#xff1a;突破浏览器并发瓶颈…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情数据可视化分析-热词情感趋势柱状图

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解微博舆情数据可视化分析-热词情感趋势柱状图…

脚本统计MongoDB集合结构信息

场景&#xff1a; 当想统计mongodb集合的结构是什么数据类型时。 1.利用variety.js解析 https://github.com/variety/variety 2.脚本 #!/bin/bash#userxxx #passwxxx host1xx.1x.1x.150 port27010 dbhgrtabs$(echo "show collections"|mongo ${host}:${port}/${db}|g…

订单簿流动性分析与机器学习在大单匹配中的应用

一、订单簿流动性的基本概念 1.1 订单簿的结构与组成 在金融市场中&#xff0c;订单簿&#xff08;Order Book&#xff09;是买卖双方提交的限价订单的集合&#xff0c;通常以价格优先、时间优先的原则进行排序。订单簿由多个层级的价格档位组成&#xff0c;每个档位包含若干限…

CSS :is () 与 :where ():简化复杂选择器的 “语法糖”

在 CSS 编写中&#xff0c;你是否遇到过这样的场景&#xff1a;需要给多个不同父元素下的子元素设置相同样式&#xff0c;结果写出一长串重复的选择器&#xff1f;比如给header、main、footer中的p标签设置相同的颜色&#xff0c;传统写法可能是header p, main p, footer p { c…

vue打包号的文件如何快速查找文件打包后的位置

解析“explorer yz-front-dist”&#xff1a;前端开发者的实用命令小知识 在前端开发的日常工作中&#xff0c;我们经常会接触到各种命令行操作&#xff0c;其中“explorer yz-front-dist”是一个看似简单却暗藏实用价值的命令。对于刚接触开发的新手来说&#xff0c;理解它的含…

Go语言数据类型深度解析:位、字节与进制

Go语言数据类型深度解析&#xff1a;位、字节与进制 在计算机编程中&#xff0c;数据类型是构建一切的基础。理解不同数据类型的特性、内存占用以及在不同场景下的应用&#xff0c;对于编写高效、可靠的代码至关重要。 本文将深入探讨Go语言中的数据类型系统&#xff0c;重点讲…

计算机视觉(opencv)——图像本质、数字矩阵、RGB + 基本操作(实战一)

OpenCV 入门教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、机器学习等领域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模块。本文将带你一步步掌握 cv2…

【数据库】使用Sql Server创建索引优化查询速度,一般2万多数据后,通过非索引时间字段排序查询出现超时情况

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录前言SQL 创建索引…

MyBatis联合查询

文章目录数据库设计MyBatis 配置MyBatis 映射文件Mapper 接口总结数据库设计 建表 SQL CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL );CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(…