【四:Unittest框架】

news2024/12/28 9:21:03

day1

总结:

from selenium import webdriver 页面及元素常用操作:
四大操作
元素操作
三大等待
三大切换 句柄/frame/alert
键盘操作 keys
鼠标操作 ActionChains
JS操作 日期控件/滚动条
下拉列表
文件上传 input/非input类型文件

pytest有inittest的区别
https://blog.csdn.net/qq_33385691/article/details/112004487image.png

一、如何开展自动化测试

1、项目需求分析,了解业务需求 web功能纳入自动化测试 web功能:
1、新功能 手工测试
2、老功能 回归 冒烟用例 纳入自动化测试
2、选择何种方式实现自动化测试
1、工具 robotframework
2、独立搭建web自动化测试框架
3、编写自动化测试用例 一边写用例,一边调试用例脚本(用例编辑/封装/测试数据/脚本调试) 结合jenkins进行持续集成
4、执行自动化测试用例
1、定时执行、一键式执行
2、执行策略 执行频率?—回归频率、转测试、上线前、 自动化测试执行环境----集成测试环境、预发布环境、
5、测试报告 测试结果的汇总
6、维护脚本、优化框架 企业自动化测试岗位:
1、业务自动化测试 项目自动化测试框架已经构建了 工作内容: 维护框架+用例编辑
2、平台自动化测试开发 参与自动测试框架构建与设计、+维护框架+用例编

二、Unittest框架 Unittest框架:

框架=测试模块+测试管理模块+测试统计模块,python的内置模块

框架四大组件

import unittest Unittest框架四大组件:
1、TestCase 测试用例
2、TestFixture
3、TestSuite
4、TestRunner

三、TestCase 测试用例

unittest中TestCase部分的规则:
1、用例类必须继承Unittest.TestCase,并且以test开头
2、每条用例,都必须以test开头
3、用例执行的顺序按照ASCII
0-9 a-z A-Z 顺序来执行用例
unittest也可以通过命令运行
命令执行TestShopnc类下的所有用例: python -m unittest 用例文件名.用例类 执行某一条用例: python -m unittest 用例文件名.用例类.用例名称

import unittest
class testShopnc(unittest.TestCase):
    def test01_login(self):
        # 用例操作步骤
        # self.driver = webdriver.Chrome()
        # self.driver.get("https://www.baidu.com")
        # el1=self.driver.find_element(By.ID,"kw")
        # el1.send_keys("码尚教育")
        print("用例01")
        # 用例断言?
    def test02_selectgoods(self):
        print("用例02")

    def test03_intocart(self):
        print("用例03")

    def test04_paygoods(self):
        print("用例04")

if __name__ == '__main__':
    # 执行方式2  执行所有用例
    # unittest.main()
    # 执行部分用例
    # suite=unittest.TestSuite()
    # 添加一个用例
    # suite.addTest(testShopnc('test01_login'))
    # suite.addTest(testShopnc('test02_selectgoods'))

    # 添加多个用例
    # caselist=[testShopnc('test03_intocart'),testShopnc('test04_paygoods')]
    # suite.addTest(caselist)
    # unittest.main(defaultTest='suite')


    # 用例加载器 加载某个用例类(继承TestCase 下的所有类)loadTestsFromTestCase
    # suite2 = unittest.TestSuite()
    # testcase2=unittest.TestLoader().loadTestsFromTestCase(testShopnc)
    # suite2.addTest(testcase2)
    # unittest.main(defaultTest='suite2')


    # 利用默认家啊在其执行用例
    suite3 = unittest.TestSuite()
    testcase3=unittest.defaultTestLoader.discover('test*.py')
    unittest.main(defaultTest='suite3')

四、TestFixture 测试夹具 执行测试用例前的前置操作及后置操作

web自动化测试:
前置操作:
后置操作:

import unittest
from selenium.webdriver.chrome import webdriver
from selenium import webdriver
from selenium.webdriver.common.by import By




class testShopnc(unittest.TestCase):
    # 前置操作
    def setUp(self):
        # webdriver.Chrome.close()
        # webdriver.Chrome.quit()
        # 加载项目
        print("setUp执行每条用例前都会执行函数代码,有n条用例,则会执行n次")

    @classmethod
    def setUpClass(cls):
        # 前置操作:连接数据,打开浏览器
        print("setUpClass执行用例前会执行 ,总共只执行一次")

    # 后置操作
    def tearDown(self) -> None:
        # 后置操作:浏览器的关闭
        print("tearDown执行完每条用例前都会执行代码,有n条用例,则会执行n次")

    @classmethod
    def tearDownClass(cls) -> None:
        # 退出浏览器,关闭数据库连接,清理数据
        print("tearDownClass执行完所有用例之后会执行代码 ,总共只执行一次")

    def test01_login(self):
        # 用例操作步骤
        # self.driver = webdriver.Chrome()
        # self.driver.get("https://www.baidu.com")
        # el1=self.driver.find_element(By.ID,"kw")
        # el1.send_keys("码尚教育")
        print("用例01")
        # 用例断言?

    def test02_selectgoods(self):
        print("用例02")

    def test03_intocart(self):
        print("用例03")

    def test04_paygoods(self):
        print("用例04")

if __name__ == '__main__':
        # 执行方式2  执行所有用例
        # unittest.main()
        # 执行部分用例
        # suite=unittest.TestSuite()
        # 添加一个用例
        # suite.addTest(testShopnc('test01_login'))
        # suite.addTest(testShopnc('test02_selectgoods'))

        # 添加多个用例
        # caselist=[testShopnc('test03_intocart'),testShopnc('test04_paygoods')]
        # suite.addTest(caselist)
        # unittest.main(defaultTest='suite')

        # 用例加载器 加载某个用例类(继承TestCase 下的所有类)loadTestsFromTestCase
        suite2 = unittest.TestSuite()
        testcase2 = unittest.TestLoader().loadTestsFromTestCase(testShopnc)
        suite2.addTest(testcase2)
        unittest.main(defaultTest='suite2')

        # 利用默认家啊在其执行用例
        # suite3 = unittest.TestSuite()
        # testcase3=unittest.defaultTestLoader.discover('test*.py')
        # unittest.main(defaultTest='suite3')


五、 TestSuite 测试套件 用例集(把需要执行的用例汇总到一起)

if __name__ == '__main__':
        # 执行方式2  执行所有用例
        # unittest.main()
        # 执行部分用例
        # suite=unittest.TestSuite()
        # 添加一个用例
        # suite.addTest(testShopnc('test01_login'))
        # suite.addTest(testShopnc('test02_selectgoods'))

        # 添加多个用例
        # caselist=[testShopnc('test03_intocart'),testShopnc('test04_paygoods')]
        # suite.addTest(caselist)
        # unittest.main(defaultTest='suite')

        # 用例加载器 加载某个用例类(继承TestCase 下的所有类)loadTestsFromTestCase
        suite2 = unittest.TestSuite()
        testcase2 = unittest.TestLoader().loadTestsFromTestCase(testShopnc)
        suite2.addTest(testcase2)
        unittest.main(defaultTest='suite2')

        # 利用默认家啊在其执行用例
        # suite3 = unittest.TestSuite()
        # testcase3=unittest.defaultTestLoader.discover('test*.py')
        # unittest.main(defaultTest='suite3')

六、TestRunner 测试运行器 执行用例,把执行的结果输出给到用户 用例执行结果状态:

. 用例执行成功
E 用例有异常
F 用例执行失败(断言失败)

day2

一、TestRunner 测试运行器 执行用例,输出测试结果
1、unittest提供生产测试报告的模块 TextTestRunner 生成文本格式测试报告

import unittest

from class01.test_02 import TestCase01

testcase=unittest.TestLoader().loadTestsFromTestCase(TestCase01)
with open('./report/report.txt','w+')as f:
    unittest.TextTestRunner(stream=f,verbosity=2).run(testcase)

2、常见的第三方库结合unittest生产html格式测试报告
HtmlTestRunner 官网下载HtmlTestRunner.py只能支持python2版本,支持Python3,需要做修改
路径:python安装路径/Lib
HtmlTestRunner 的应用
BeatifulReport 的应用

# -!- coding: utf-8 -!-
import unittest
import HTMLTestRunner
from BeautifulReport import BeautifulReport
from class01.test_02 import TestCase01

testcase=unittest.TestLoader().loadTestsFromTestCase(TestCase01)
# 生成BeautifulReport报告
BeautifulReport(testcase).report(filename='百度测试报告', description='搜索测试', report_dir='.')    #log_path='.'把report放到当前目录下


企业测试报告的优化及定制 优化测试报告模板 通过js+html/html5

1、pytest+allure 生成更加美观的测试报告+优化定制(装饰器)

from twisted.trial import unittest
import unittest

class TestCase01(unittest.TestCase):

    @unittest.skip("此用例暂时不启用")
    def test_login(self):
        """
        登录
        :return:
        """
        print("用例01")
    @unittest.skipIf(3>2,"条件为真,则跳过执行")
    def test_selectgoods(self):
        """
        检索商品
        :return:
        """
        print("用例02")

    @unittest.skipUnless(2>3,"条件:2>3不成立,则跳过执行")
    def test_gointocart(self):
        """
        加入购物车
        :return:
        """
        print("用例03")
        """
        @unittest.skip 强制跳过执行
        @unittest.skipIf 符合条件,则跳过执行
        @unittest.skipUnless 条件不成立,则跳过执行
        """


@unittest.skipUnless(False,"整个模块下的用例强制跳过执行")
class TestSkipModule(unittest.TestCase):

    def test_login(self):
        """
        登录
        :return:
        """
        print("用例01")

    def test_selectgoods(self):
        """
        检索商品
        :return:
        """
        print("用例02")

    def test_gointocart(self):
        """
        加入购物车
        :return:
        """
        print("用例03")

if __name__ == '__main__':
    unittest.main()

2、装饰器 @ unittest.skip 强制跳过&条件跳过

import unittest

class TestCase01(unittest.TestCase):
    @unittest.skip("此用例暂时不启用")
    def test_login(self):
        """
        登录
        :return:
        """
        print("用例01")
    @unittest.skipIf(3>2,"条件为真,则跳过执行")
    def test_selectgoods(self):
        """
        检索商品
        :return:
        """
        print("用例02")

    @unittest.skipUnless(2>3,"条件:2>3不成立,则跳过执行")
    def test_gointocart(self):
        """
        加入购物车
        :return:
        """
        print("用例03")
        """
        @unittest.skip 强制跳过执行
        @unittest.skipIf 符合条件,则跳过执行
        @unittest.skipUnless 条件不成立,则跳过执行
        """

@unittest.skipUnless(False,"整个模块下的用例强制跳过执行")
class TestSkipModule(unittest.TestCase):

    def test_login(self):
        """
        登录
        :return:
        """
        print("用例01")

    def test_selectgoods(self):
        """
        检索商品
        :return:
        """
        print("用例02")

    def test_gointocart(self):
        """
        加入购物车
        :return:
        """
        print("用例03")

if __name__ == '__main__':
    unittest.main()

3、unittest的常用断言方法

# 常用断言方法
# 1、assertIn(字符1,字符2) 字符1是否包含在字符2
# 2、self.assertNotIn(字符1,字符2) 字符1不包含包含在字符2
self.assertEqual(参数1, 参数2, "断言失败的描述")  参数1等于参数2
self.assertNotEqual (参数1, 参数2, "断言失败的描述")  参数不等于参数2
self.assertTrue(True)
self.assertFalse(False)
from selenium import webdriver
class TestCase01(unittest.TestCase):
def setUp(self)> None:
# 打开chrome浏览器
self.driver = webdriver.Chrome()
def test_selectgoods(self):
    self.driver.get("http://47.107.116.139/shopnc/shop/")
    # 定位搜索输入
    el_select = self.driver.find_element(By.ID, "keyword")
    el_select.send_keys("手机")
    el_button = self.driver.find_element(By.ID, "button")
    el_button.click()
    time.sleep(2)
    # 断言:验证测试结果与预期结果是否一致
    # 获取商品列表的标题
    content = self.driver.find_element(By.XPATH, "//div[@class='goods‐name']/a").text
    print(content)
    # 判断content是否包含手机字符?
    # 常用断言方法
    """
    常用断言方法
    1、assertIn(字符1,字符2) 字符1是否包含在字符2
    2、self.assertNotIn(字符1,字符2) 字符1不包含包含在字符2
    self.assertEqual(参数1,参数2,"断言失败的描述") 参数1等于参数2
    self.assertNotEqual(参数1,参数2,"断言失败的描述")参数不等于参数2
    self.assertTrue(True)
    self.assertFalse(False)
    """
    # 标题是否包含手机
    self.assertIn("手机2222", content, "断言失败的描述")
    # 列表下有多少个商品 返回元素列表得到个数
    # count=els.count
    # self.assertEqual(count,1)

4、报告的生成

# -!- coding: utf-8 -!-
import unittest
import HTMLTestRunner
from BeautifulReport import BeautifulReport

from class01.test_02 import TestCase01

testcase=unittest.TestLoader().loadTestsFromTestCase(TestCase01)
# with open('./report/report.txt','w+')as f:
    # unittest自带的报告
    # unittest.TextTestRunner(stream=f,verbosity=2).run(testcase)


#
# with open('./report/report.html','wb+')as f:
#     # htmlt自带的报告  2.3一下版本才能支持
#     runner=HTMLTestRunner.HTMLTestRunner(stream=f,title="教育报告",description="描述")
#     runner.run(testcase)


# 生成BeautifulReport报告
BeautifulReport(testcase).report(filename='百度测试报告', description='搜索测试', report_dir='.')    #log_path='.'把report放到当前目录下





day3

POM-页面对象模型

POM page object model 页面对象模型 WEB自动化测试框架应用最为广泛的一种框架
设计模式
设计思路:web项目由很多页面组成,把每个页面当做页面对象来进行设计
Python专题:什么是对象?通过类描述一组对象 对象=属性+方法
码尚电商项目=n个页面=登录页面=对每个页面设计对应页面类=相同属性+相同的方法
登录页面=对每个页面设计对应页面类=相同属性+相同的方法
class LoginPage:
#属性?元素、页面标题…
#方法?你在页面进行操作/行为:点击、定位、输入…等等元素及页面的操作
每个页面有相同的属性及方法 比如:点击、输入、元素定位
基于POM进行设计分为四层进行架构:
第一层 basepage 层 每个页面有相同的属性及方法 比如:点击、输入、元素定位
第二层 pageobjects 层 针对每个页面定义页面类 每个页面有独有的属性及方法 登录页面 LoginPage类 注册页面 RegisterPage类
第三层 TestCases层 用例层包含项目的业务流程
第四层 TestData测试数据

二、如何基于POM进行自动化框架架构?

1、base层封装

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class BasePage:
    """
    BasePage:定义每个页面的相同属性及方法
    相同属性?获取浏览器驱动对象(数据)
    相同方法?元素定位、点击、输入...等等操作
    """
    def __init__(self,driver=webdriver.Chrome()):
        self.driver=driver
    
    def locator(self,loc):
        """元素定位"""
        # loc=(By.LINK_TEXT,"登录"
        # WebElement对象
        return self.driver.find_element(*loc)
    
    def input(self,loc,value):
        """输入"""
        self.locator(loc).send_keys(value)
    
    def click(self,loc):
        """点击"""
        self.locator(loc).click()
    
    def sleep(self,s):
        time.sleep(s)

2、pageobjects层封装

import time

from selenium.webdriver.common.by import By

from class09.base.basepage import BasePage


class LoginPage(BasePage):
    
    """
    登录页面类=页面独有的属性及方法
    页面独有的属性:页面元素定位
    方法:登录页面的操作
    """
    #登录页面的属性
    el_username=(By.ID,"user_name")
    el_password=(By.ID, "password")
    el_login=(By.XPATH, "//input[@name='Submit']")
    url="http://47.107.116.139/shopnc/shop/index.php?act=login&op=index"

    #方法
    def login(self,usname,passwd):
        #实现登录的步骤
        self.driver.get(self.url)
        self.sleep(2)
        # 输入用户名
        self.input(loc=self.el_username,value=usname)
        # 输入密码
        self.input(loc=self.el_password,value=passwd)
        # 点击登录
        self.click(loc=self.el_login)
        time.sleep(2)


class GoodlistPage(BasePage):
pass

3 、TestCases层封装

import unittest
from class09.pageobjects.webpage import LoginPage

class TestLogin(unittest.TestCase):
def test_login(self):
    # 实例化对象
    loginpage=LoginPage()
    username = "xingyao"
    password = "mashang"
    loginpage.login(username,password)

day4

数据驱动:现在主流的设计模式之一(以数据驱动测试)

结合unittest框架如何实现数据驱动?ddt模块实现
数据驱动的意义:通过不同的数据对同一脚本实现循环测试,最终实现数据与脚本的分离
ddt模块模块的安装 pip install ddt
ddt模块:一个类装饰器+三个装饰器方法
ddt类装饰器 装饰继承unittest.TestCase的类
data装饰器方法 data()装饰器方法把列表、元组、字典作为参数
unpack装饰器方法 实现把复杂的数据实现分解成多个数据
file_data装饰器方法 可以直接接收数据文件(json数据/基于yaml数据文件),实现循环测试

关键字驱动:现在主流的设计模式之一

什么关键字驱动?(以关键字函数驱动测试)
关键字驱动又叫动作字驱动
把项目业务封装成关键字函数,再基于关键字函数实现自动化测试
项目业务实现转化为关键字函数?
覆盖项目业务=用例集合覆盖测试
用例集合=一个一个用例实现覆盖测试
覆盖用例=多个操作步骤组成=多个关键字函数
操作步骤封装成对应的关键字函数
比如:登录用例
登录用例=多个操作步骤组成 基于每个操作步骤封装对应的关键字函数
登录用例:
1、打开浏览器 关键字函数open_browser()
2、加载项目地址 关键字函数load_url()
3、输入用户名 关键字函数 input()
4、输入密码 关键字函数 input()
5、点击登录 关键字函数 click()
pom :把每个页面当做一个对象来进行编程 实现某个业务流程的测试=调用页面对象的一
些属性及方法实现测试
数据驱动:用外部数据驱动测试
关键字驱动:所有业务流程封装成对应的函数 实现某个业务流程的测试=调用多个关键字
方法,实现业务流程的测试 难点:封装什么样的关键字函数?

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

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

相关文章

Cesium 学习教程 - 地球以及渲染数据导出(打印)图片

Cesium 学习教程 - 地球以及渲染数据导出(打印)图片 地球导出核心代码完整代码:在线示例 本文包括地球导出核心代码、完整代码以及在线示例。 地球导出核心代码 这里放上核心代码: /*** todo canvas 导出图片* param {string} da…

MT8766核心板详细参数_MTK联发科4G安卓核心板智能通讯模块

MT8766安卓核心板采用四核2.0GHz主频芯片方案,国内4G全网通。12nm先进工艺,支持Android 9.0系统。GPU采用超强 IMG GE8300 。 可流畅适配大数据运算、人脸识别算法、多种识别模式。支持高速LPDDR4/X,主频高达1600MHz。支持EMMC5.1。标配 WIF…

bug记录——The bean ‘xxx.FeignClientSpecification‘ could not be registered.

问题描述 在一个项目中,用了两个feign,这两个feign都走了网关,当启动项目时,启动失败,并且报错: The bean ‘petCF-gateway.FeignClientSpecification’ could not be registered. A bean with that name …

java--自动类型转换

1.什么是自动类型转换,为什么要进行自动类型转换? 类型范围小的变量,可以直接赋值给类型范围大的变量 2.自动类型转换在计算机中执行原理 解释说明:byte类型变量在内存中只占一个字节,因此会把12转为八进制放到内存中…

Butterworth型IIR滤波器

本文参考 https://zhuanlan.zhihu.com/p/580458091 1、数字角频率ω与模拟角频率Ω的理解 我们之前的课程接触最多的是模拟频率f,包括在模拟电路、高频电路以及传感器课程上,都是以f作为频率响应函数的横坐标。使用f的好处是其真实反映了实际系统的工作…

android 指针动画转动

记录一种简单动画 效果图&#xff1a; 都是直接使用图片资源FrameLayout布局实现&#xff0c;布局如下&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…

Android13 实现有线网络和wifi共存

Android13 实现有线网络和wifi共存 文章目录 Android13 实现有线网络和wifi共存一、前言二、修改代码&#xff1a;1、ConnectivityService.java2、NetworkFactoryImpl.java3、Android11 和Android13 修改代码目录对比&#xff1a;4、如果只修改部分代码的后果只修改 Connectivi…

短视频矩阵系统源码---开发

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#x…

图的匹配相关学习笔记

二分图最大匹配 二分图是一种奇妙的图&#xff0c;它满足可以把其内部的节点划分成两个集合&#xff0c;且这每个集合内部的的点没有边相连。 二分图的判定 二分图的判定定理&#xff1a;一张无向图是二分图&#xff0c;当且仅当图中不存在奇环&#xff08;长度为奇数的环&am…

VisualStudio安装VSIX离线包的方法

一、安装的原理 1、使用的window工具&#xff1a;CMD或者powerShell 2、vs中用于安装vsix的exe&#xff1a; 二、安装过程 1、在VSIXInstaller.exe同级目录启动PowerShell &#xff08;1&#xff09;鼠标移到空白处 &#xff08;2&#xff09;Shift 鼠标右键 &#xff08;…

物联网_00_物理网介绍

1.物联网为什么会出现? 一句话-----追求更高品质的生活, 随着科技大爆炸, 人类当然会越来越追求衣来伸手饭来张口的懒惰高品质生活, 最早的物联网设备可以追溯到19世纪末的"在线可乐售卖机"和"特洛伊咖啡壶"(懒惰的技术人员为了能够实时看到物品的情况而设…

BAT032:批量替换当前目录下文件的部分字符

引严&#xff1a;编写批处理程序&#xff0c;实现批量替换当前目录下文件的部分字符。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑】。…

飞速(FS)MTP®光纤跳线系列——数据中心布线理想选择

数据中心的重要定位要求其使用的光纤跳线具有高性能和高可靠性。飞速&#xff08;FS&#xff09;MTP光纤产品系列能够以简单的安装方式快速部署高密度链路&#xff0c;优化线缆管理&#xff0c;确保充分利用通道空间&#xff0c;显著减少安装时间和成本。 飞速&#xff08;FS&…

线性代数-Python-02:矩阵的基本运算 - 手写Matrix及numpy中的用法

文章目录 一、代码仓库二、矩阵的基本运算2.1 矩阵的加法2.2 矩阵的数量乘法2.3 矩阵和向量的乘法2.4 矩阵和矩阵的乘法2.5 矩阵的转置 三、手写Matrix代码Matrix.pymain_matrix.pymain_numpy_matrix.py 一、代码仓库 https://github.com/Chufeng-Jiang/Python-Linear-Algebra-…

uni-app:实现时钟自走(动态时钟效果)

效果 核心代码 使用钩子函数 mounted()&#xff0c;设置定时器&#xff0c;是指每秒都要去执行时间的获取&#xff0c;以至于实现时间自走的效果 mounted() { this.updateTime(); // 初始化时间 setInterval(this.updateTime, 1000); // 每秒更新时间 }, 自定义方法…

2022年亚太杯APMCM数学建模大赛E题有多少核弹可以摧毁地球求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 E题 有多少核弹可以摧毁地球 原题再现 1945年8月6日&#xff0c;第二次世界大战即将结束。为了尽快结束战争&#xff0c;美国在日本广岛投下了下一颗名为“小男孩”的原子弹。这样一颗原子弹在广岛炸死了20万人&#xff0c;广岛的所有建筑物都…

BAT033:批量删除文件特定字符及特定字符之后的字符

引言&#xff1a;编写批处理程序&#xff0c;实现批量删除文件特定字符及特定字符之后的字符。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【…

【计算机网络】OSI参考模型中非端-端层(物理层、数据链路层、网络层)功能介绍

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

表示本机IP地址的方式(三种方式)

1、本机和网络上的其他主机都可以通过IP地址访问到服务器 2、通过 127.0.0.1 或者 localhost 访问 127.0.0.1 和 localhost 它们完全等价 只能 本机 通过 127.0.0.1 或者 localhost 访问&#xff0c;网络上的其他主机无法访问 3、 通过 0.0.0.0 访问服务器 表示所有可…

Element Plus el-form表单自定义插槽如何使用

//正常无插槽表单<el-form :model"form" label-width"120px"><el-form-item label"Activity name"><el-input v-model"form.name" /></el-form-item></el-form>//带插槽表单//适用二次封装的form组件&l…