pytest基本应用

文章目录

  • 1.pytest安装
  • 2.用例运行规则
  • 3.常用参数
    • 断言
    • 运行参数
    • 用例控制
    • setup和teardown
    • ini配置文件
  • 4.常用插件
  • 5.pytest高阶用法
    • 用例跳过
    • 参数化
  • 6.pytest之Fixture使用
    • fixture使用
    • 装饰器usefixtures
  • 7.pytest之conftest.py
  • 8.conftest+fixture+yield
    • yield介绍
    • 前后置使用

1.pytest安装

pip install pytest

环境配置:需要设置项目的默认运行方式为unittest

image-20240219173134149

2.用例运行规则

  • pytest将在当前目录及其子目录中运行所有格式为test_*.py开头或*_test.py结尾的文件
  • 测试方法/测试函数 默认必须是test开头
  • 测试类必须是Test开头
  • 测试类不能有构造方法 __init__

示例:
image-20240219174600866

运行时可以扫描到当前目录和当前子目录下的用例:

image-20240219175351372

3.常用参数

断言

断言借助Python中的运算符号和assert关键字实现;

# -*- coding: utf-8 -*-
# @Time    : 2024/2/19 17:56
# @Author  : 居里夫人吃橘子
# @File    : test_demo03.py
# @Software: PyCharm
import pytest

"""
    测试不相等 !=
    <=
    >=
    测试包含 in
    测试不包含 not in
    判断是否为true: is True
    判断是否不为true: is not True/is False
    and
    or
"""


def test_demo03():
    print('kkkkkkk')
    # assert 1 == 1
    # assert 1 != 2
    # assert 1 < 2
    # assert 1 > 2
    # assert 'a' in 'abc'
    # assert 'a' not in 'abc'
    # assert True
    # assert False
    # assert 1 == 1 and 1 < 2
    assert 1 == 2 or 1 < 2


if __name__ == '__main__':
    pytest.main(['-s'])

运行参数

“-s” 参数 用于关闭捕捉,从而输出打印信息到控制台

image-20240219181159678

“-v” 参数 用于显示具体的用例执行信息‘

image-20240219181223263

“-k” 运行名称中包含某字符串的测试用例,类似于模糊查找

image-20240219181253437

‘-q’ 简化输出信息

image-20240219181513726

‘-x’ 如果出现一条测试用例失败,则退出测试

image-20240219181740670

指定运行测试文件中的方法或特定的类

pytest.main([‘-s’, ‘./son_dir/test_son01.py::TestDemo01’])

image-20240220094429285

用例控制

  • 在第N个用例失败后,结束测试;
pytest.main(['-s','test_demo03.py','--maxfail=1'])

image-20240220094942836

  • 失败用例重跑

安装插件pytest-rerunfailures,注意Python版本需要>3.5;pytest>5.0

pip install pytest-rerunfailures

# '--reruns'表示重跑次数;'--reruns-delay'表示失败后间隔几秒
pytest.main(['--reruns', '3', '--reruns-delay', '1', 'test_demo03.py'])  

image-20240220104339361

  • 通过标记表达式执行指定的用例

通过@pytest.mark.标记名装饰器标记指定的测试用例,使用pytest.main(['-m', '标记名'])执行;

注:标记名需要提前注册,创建pytest.ini文件;标记名称冒号后面的为注释,最好使用英文;

[pytest]
markers =
    ma: marks tests as smoke
    slow: slow testcase
@pytest.mark.slow
def test_demo05():
    print('5555555555')

if __name__ == '__main__':

    pytest.main(['-s', 'test_demo03.py', '-m', 'slow'])

image-20240220095951444

  • 多进程执行测试用例

安装插件pytest-xdist;

pip install pytest-xdist

pytest.main(['-n', 'auto', 'test_demo03.py']) #auto为自动分配与计算机相匹配的进程;也可以指定数字

image-20240220103619825

setup和teardown

  • 不含有类的用例前置和后置

1.setup_module/teardown_module: 在当前文件中,在所有测试用例执行之前与之后执行
2.setup_function/teardown_function:在每个测试函数之前与之后执行

# -*- coding: utf-8 -*-
# @Time    : 2024/2/20 10:49
# @Author  : 居里夫人吃橘子
# @File    : test_set01.py
# @Software: PyCharm


# 功能函数,相乘
import pytest


def multiply(a, b):
    return a * b


"""
    不含有类的用例预置和后置函数
    第一批次:setup_module/teardown_module: 在当前文件中,在所有测试用例执行之前与之后执行
    第二批次:setup_function/teardown_function:在每个测试函数之前与之后执行,不能在类中使用
    ps:执行的顺序按优先级来的,改变方法位置结果也一样
"""


# 在当前文件前置后置
def setup_module(module):
    print("setup_module===================")


def teardown_module(module):
    print("teardown_module================")


# 每个用例前置后置
def setup_function(function):
    print("setup_function===================")


def teardown_function(function):
    print("teardown_function================")


# ========测试用例=========
def test01():
    print("第一个用例")
    print(multiply(3, 4))


def test02():
    print("第二个用例")
    print(multiply(4, 4))


if __name__ == '__main__':
    pytest.main(['-s', 'test_set01.py'])

image-20240220142300991

  • 含有类的用例前置和后置

1.setup_class/teardown_class:在当前的测试类的开始和结束时执行
2.setup_method/teardown_method:在每个测试方法开始与结束时执行
ps:执行的顺序按优先级来的,改变方法位置结果也一样

# -*- coding: utf-8 -*-
# @Time    : 2024/2/20 14:23
# @Author  : 居里夫人吃橘子
# @File    : test_set02.py
# @Software: PyCharm

# 功能函数
import pytest


def multiply(a, b):
    return a * b


class TestCase:
    """
        第一批次:setup_class/teardown_class:在当前的测试类的开始和结束时执行
        第二批次:setup_method/teardown_method:在每个测试方法开始与结束时执行
        ps:执行的顺序按优先级来的,改变方法位置结果也一样
    """

    # 每个测试类前置后置
    @classmethod
    def setup_class(cls):
        print("setup_class========================")

    @classmethod
    def teardown_class(cls):
        print("teardown_class======================")

    # 每个测试方法前置后置
    def setup_method(self, method):
        print("setup_method===================")

    def teardown_method(self, method):
        print("teardown_method================")


    # ============测试用例============
    def test01(self):
        print("类里的第一条用例")
        print(multiply(2, 2))

    def test02(self):
        print("类里的第二条用例")
        print(multiply(4, 4))


if __name__ == '__main__':
    pytest.main(['-s', 'test_set02.py'])

image-20240220153317481

ini配置文件

  • ini配置文件可以配置一次后运行文件默认生效,注意文件名必须为pytest.ini

pytest.ini

[pytest]
# 01 命令行参数,默认加到执行过程中
addopts = -s -v
# 02 指定要运行的测试目录
testpaths = ./son_dir
# 03 指定要运行的测试文件规则
python_files = auto_*.py
# 04 指定要运行的类名规则
python_classes = A* B*
# 05 指定要运行的测试用例方法/函数名
python_functions = ff*

image-20240220164238799

image-20240220164250253

4.常用插件

插件列表网址:https://docs.pytest.org/en/latest/reference/plugin_list.html

5.pytest高阶用法

用例跳过

  • 有条件跳过测试用例:@pytest.mark.skipif(condition=3 > 2, reason='不想执行了')
  • 无条件跳过测试用例:@pytest.mark.skip
# -*- coding: utf-8 -*-
# @Time    : 2024/2/19 17:30
# @Author  : 居里夫人吃橘子
# @File    : test_01.py
# @Software: PyCharm
import pytest


def test_demo01():
    print('第一条测试用例')


def test_demo02():
    print('第二条测试用例')


# 如果condition中的条件为Ture,则跳过用例
@pytest.mark.skipif(condition=3 > 2, reason='不想执行了')
def test_demo03():
    print('第三条测试用例')


# 无条件跳过测试用例
@pytest.mark.skip(reason='不想跑了')
def test_demo04():
    print('第四条测试用例')


if __name__ == '__main__':
    pytest.main(['-s', 'test_01.py'])

参数化

pytest中的参数化使用装饰器@pytest.mark.parametrize

  • 多参数化
import pytest
import math


# pytest 参数化
# "base, exponent, expected"用来定义参数名,通过数组定义时,每一个元组都是一条测试用例使用的数据;ids默认为None代表用例名称
@pytest.mark.parametrize("base, exponent, expected", [(2, 2, 4), (2, 3, 8), (1, 9, 1), (0, 9, 0)],ids=["case1", "case2", "case3", "case4"])
def test_pow(base, exponent, expected):
    assert math.pow(base, exponent) == expected


if __name__ == '__main__':
    pytest.main(['-s', '-v', 'test_fuc.py'])

image-20240220165829952

  • 函数参数化
import pytest


def return_data():
    return [('zz', '123456'), ('xz', '123456'), ('qs', '123456')]

# 把函数return_data()的值都赋给'data'上;
@pytest.mark.parametrize('data', return_data())
def test_01(data):
    print(data[0], data[1])


if __name__ == '__main__':
    pytest.main(['-s', 'test_func02.py'])

  • yaml文件驱动参数化

demo01.yaml

-
  name : '小李'
  sex : '男'

-
  name: '小王'
  sex: '女'
import yaml
import pytest


def pase_yaml():
    with open('./file/demo01.yaml', 'r', encoding='utf-8') as f:
        data = yaml.load(f, Loader=yaml.FullLoader)
        return data


@pytest.mark.parametrize('data', pase_yaml())
def test_demo01(data):
    print(data['name'])
    print(data['sex'])


if __name__ == '__main__':
    pytest.main(['-s', '-v', 'test_fuc02.py'])

输出:

image-20240220172020943

6.pytest之Fixture使用

在测试中,fixture为测试提供了已定义的,可靠的和一致的上下文。这可能包括环境(例如,通过已知的参数配置数据库)或内容(例如,数据集)。Fixtures定义了构成测试准备阶段的步骤和数据。在pytest中,它们是为这些目的而定义的函数。它们也可以用来定义测试执行阶段;这是一个设计复杂用例的强大技术。测试功能通过参数访问由fixtures设置的服务,状态或其他操作环境。对于测试功能使用的每个fixture,通常在测试功能的定义中都有一个参数(在 fixture后命名)。
我们可以通过用修饰器@pytest.fixture来告诉pytest某个特定函数是一个fixture 。

fixture使用

  • 单个fix使用
import pytest


@pytest.fixture
def fix01():
    print('这是fix01开始运行了')
    print('fix01运行结束')


def test_demo01(fix01):
    print('测试用例1')


if __name__ == '__main__':
    pytest.main(['-s', 'test_fix_demo01.py'])

image-20240221101756912

  • 多个fix使用,并接受fix中的数据
import pytest


@pytest.fixture
def fix01():
    print('这是fix01开始运行了')
    print('fix01运行结束')


@pytest.fixture
def fix02():
    print('这是fix02开始运行了')
    data = ['小王', '小李']
    return data


def test_demo01(fix01, fix02):
    print('测试用例1')
    print(fix02[0])


if __name__ == '__main__':
    pytest.main(['-s', 'test_fix_demo02.py'])

image-20240221102330997

  • 多个fix之间互相调用
import pytest


@pytest.fixture
def first_fix():
    return "a"


@pytest.fixture
def order(first_fix):
    return [first_fix]


# 测试用例
def test_string(order):
    order.append("b")
    print(order)


if __name__ == '__main__':
    pytest.main(['-s', 'test_fix_demo03.py'])

image-20240221102654055

装饰器usefixtures

说明
@pytest.mark.usefixtures是Pytest调用fixture的方法之一,与直接传入fixture不同的是,它无法获取到被fixture装饰的函数的返回值。
@pytest.mark.usefixtures的使用场景是被测试函数需要多个fixture做前后置工作时使用,个人感觉没啥大用,因为fixture也可以同时传入多个fixture

示例

import pytest


@pytest.fixture
def fix01():
    print('这是fix01开始运行了')
    print('fix01运行结束')


@pytest.fixture
def fix02():
    print('这是fix02开始运行了')
    data = ['小王', '小李']
    return data


@pytest.fixture
def fix03():
    print('这是fix03开始运行了')
    print('fix03运行结束')


# @pytest.mark.usefixtures('fix01', 'fix03')
# # @pytest.mark.usefixtures('fix01','fix02') # 如果使用userfixtures('fix02')则会报错,因为userfixtures无法获取fix中的返回数据
# def test_demo01():
#     print('测试用例1')


@pytest.mark.usefixtures('fix03')
@pytest.mark.usefixtures('fix01')
def test_demo01():
    print('测试用例1')


if __name__ == '__main__':
    pytest.main(['-s', 'test_fix_demo04.py'])

注:@pytest.mark.usefixtures('fix01', 'fix03')叠加使用时按照就近原则执行,先在前的先执行,先在下的先执行;

7.pytest之conftest.py

介绍

conftest.py是fixture函数的一个集合,可以理解为公共的提取出来放在一个文件里,然后供其它模块调用。不同于普通被调用的模块,conftest.py使用时不需要导入,Pytest会自动查找。并且支持多个py文件同时调用其中的fixture

规则

  • 文件名必须为conftest.py;
  • conftest.py文件必须与测试用例在同一个包下

示例

conftest.py文件

import pytest

@pytest.fixture
def fix01():
    print('这是fix01开始运行了')
    print('fix01运行结束')

test_conftest01.py

import pytest


# 测试用例
def test_conf01(fix01):
    print('开始运行测试用例1')


if __name__ == '__main__':
    pytest.main(['-s', 'test_conftest01.py'])

输出:

image-20240221133639842

示例2

conftest.py文件中可以设置@pytest.fixture(scope='',autouse='')中的参数:

  • scope表示在什么时候执行:

    session:表示在所有测试文件执行前执行一次

    package:在所有包执行前执行一次

    module:在每一个py文件前执行一次

    class:在每个测试类前执行一次

    function:在每个测试用例前执行一次

  • autouse=Ture表示测试用例中不需要写fixture的名称,自动生效,默认为False

conftest.py

import pytest


@pytest.fixture(scope='session', autouse=True)
def fix01():
    print('开始执行session')


@pytest.fixture(scope='package', autouse=True)
def fix2():
    print('开始执行package')


@pytest.fixture(scope='module', autouse=True)
def fix3():
    print('开始执行module')


@pytest.fixture(scope='class', autouse=True)
def fix4():
    print('开始执行class')

test_conftest01.py

import pytest


# 测试用例
def test_conf01():
    print('开始运行测试用例1')

# 当测试用例没有在class中时,也会默认执行一次class层级的fixture
def test_conf02():
    print('开始运行测试用例2')


class TestDemo:
    def test_conf03(self):
        print('开始运行测试用例3')


if __name__ == '__main__':
    pytest.main(['-s', 'test_conftest01.py'])

输出:

C:\Users\11361\AppData\Local\Programs\Python\Python38\python.exe D:\PythonTest\Study\class_pytest02\test_conftest_demo01\test_conftest01.py 
============================= test session starts =============================
platform win32 -- Python 3.8.7, pytest-8.0.1, pluggy-1.4.0
rootdir: D:\PythonTest\Study\class_pytest02\test_conftest_demo01
plugins: anyio-3.6.2, dependency-0.6.0, rerunfailures-13.0, xdist-3.5.0
collected 3 items

test_conftest01.py 开始执行session
开始执行package
开始执行module
开始执行class

开始执行function
开始运行测试用例1
.开始执行class

开始执行function
开始运行测试用例2
.开始执行class

开始执行function
开始运行测试用例3
.

============================== 3 passed in 0.05s ==============================

进程已结束,退出代码0

8.conftest+fixture+yield

yield介绍

"""
    1.程序开始执行以后,因为test函数终有yield关键字,
    所以test函数并不会真正的执行,而是先得到一个生成器g
    2.直到调用next方法,test函数正式开始执行,先执行test函数中的print方法,
    然后进入while循环
    3.程序遇到yield关键字,然后把yield相当于是return,return了一个8之后,程序停止,
    并没有执行赋值给a操作,此时next(g)语句执行完成,所以输出前面两行(第一行是while上面的
    print的结果,第二行是return出来的结果)
    4.程序执行print("=====================")
    5.又开始执行下面的print(next(g)),这个时候是从刚才next程序停止的地方开始执行,
    也就是要执行a的赋值操作,这个时候因为赋值操作的右边是没有值的,已经被return出去了
    这个时候a的值是none,所以接下来的输出是a:none
    6.程序会继续在whili里执行,又一次碰到yield,这个时候同样return出8,然后程序停止。
    print函数输出的8就是这次return出的8
"""


def test():
    print("begin....")
    while True:
        a = yield 8
        print("a:", a)


g = test()
print(next(g))
print("=====================")
print(next(g))
print("=====================")
print(next(g))

#输出
begin....
8
=====================
a: None
8
=====================
a: None
8

前后置使用

conftest.py

import pytest


@pytest.fixture
def fix1():
    print('conftest里的fix1')
    yield
    print("用例执行完成,我来扫尾")

test_yeild01.py

import pytest


def test_case(fix1):
    print("测试用例一")


if __name__ == '__main__':
    pytest.main(['-s'])

输出:

C:\Users\11361\AppData\Local\Programs\Python\Python38\python.exe D:\PythonTest\Study\class_pytest02\test_yeild_demo01\test_yeild01.py 
============================= test session starts =============================
platform win32 -- Python 3.8.7, pytest-8.0.1, pluggy-1.4.0
rootdir: D:\PythonTest\Study\class_pytest02\test_yeild_demo01
plugins: anyio-3.6.2, dependency-0.6.0, rerunfailures-13.0, xdist-3.5.0
collected 1 item

test_yeild01.py conftest里的fix1
测试用例一
.用例执行完成,我来扫尾


============================== 1 passed in 0.06s ==============================

进程已结束,退出代码0

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

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

相关文章

2012及其以上系统修改服务器密码指南

修改服务器密码指南,目前介绍两种不同的方案 方法一 指令式 winR键 弹出运行框里输入 cmd 点击确认或者右下角开始程序里面的点开运行 2.在弹出框里手动输入以下一组文字&#xff1a;net user administrator 123456 框内无法粘贴 需要手动输入 其中administrator 是用…

4核8G服务器腾讯云和阿里云租用价格对比,2024更新

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…

Sora刷爆了,先来了解下基本情况

2月15日&#xff0c;OpenAI发布的Sora模型确实在文生视频领域取得了显著的进步&#xff0c;其特点和创新性表现在以下几个方面&#xff1a; 视频生成长度&#xff1a;Sora模型能够生成长达1分钟的视频&#xff0c;这相比之前的文生视频模型有了显著的提升。这一长度的视频已经…

后端程序员入门react笔记——react的diff算法(三)

diffing算法 虚拟dom 我们知道&#xff0c;react里面操作的都是虚拟dom&#xff0c;最后经过render渲染为真正的dom&#xff0c;那么为什么要提出虚拟dom这个概念呢&#xff1f;其实就是将逻辑和视图区分开&#xff0c;react的虚拟dom&#xff0c;就相当于mvc的c&#xff0c;…

网络安全实验(三)补充

1.假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要接受外网用户上传的文件。针对该场景进行防病毒的防护。 2.我们需要针对办公区用户进行上网行为管理&#xff0c;要求进行URL过滤&#xff0c;要求在上班时间仅能访问教…

UE蓝图 入口(FunctionEntry)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 文章目录 系列文章目录一、FunctionEntry节点功能二、入口节点用法1. 创建函数2. 命名函数3. 定义参数4. 编写函数逻辑5…

http协议工具:apache详解

目录 一、常见的http服务程序 1、 Apache HTTP Server 介绍 1.1 apache 概念 1.2 apache 功能 1.3 apache 特性 2、MPM&#xff08;multi-processing module&#xff09;工作模式 2.1 prefork 2.2 worker 2.3 event 二、Apache HTTP Server安装和相关文件 1、安装方…

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测…

AWS安全组是什么?有什么用?

最近看到小伙伴在问&#xff0c;AWS安全组是什么&#xff1f;有什么用&#xff1f;今天我们大家就来简单聊聊&#xff0c;仅供参考哦&#xff01; AWS安全组是什么&#xff1f;有什么用&#xff1f; 【回答】&#xff1a;AWS安全组是一种虚拟防火墙&#xff0c;用于控制进出…

Eclipse项目间的引用

我们在开发的时候&#xff0c;有时候需要把一个大的项目打散&#xff0c;尤其是现在微服务的架构很流行&#xff0c;一个大的项目往往被拆成很多小的项目&#xff0c;而有的项目作为公共工程被独立出来&#xff0c;比如有个工程专门提供各种Util工具类&#xff0c;有的工程专门…

【hoare优化版】快速排序算法(2)

目录 GitMidi三数取中 整体思想 图解分析 代码实现 Hoare优化 上篇我们介绍了hoare基础版&#xff0c;但是这种代码存在缺陷&#xff0c;所以我们提出了两种解决方案。主流的解决方案就是【三数取中选key】 GitMidi三数取中 在快排的过程中&#xff0c;每一次我们要取一…

Hive--内部表常用操作 全面且详细

文章中关于内部表常用操作目录 一、隔符 二、根据查询结果创建表 ​​​​​​​三、根据已经存在的表结构创建表 ​​​​​​​四、查询表的类型 ​​​​​​​五、删除表 ​​​​​​​一、隔符 create table if not exists stu2(id int ,name string) row format d…

分享:大数据信用查询去什么样的平台查?

在当今社会&#xff0c;大数据信用查询已经成为企业和个人了解自身信用状况的重要途径。然而&#xff0c;面对众多的大数据信用查询平台&#xff0c;如何选择一个可靠的平台进行查询呢?本文将为您介绍一些选择大数据信用查询平台的关键因素。 一、平台信誉度 首先&#xff0c;…

django自定义后端过滤

​ DRF自带的过滤 第一个 DjangoFilterBackend 是需要安装三方库见[搜索&#xff1a;多字段筛选]两外两个是安装注册了rest_framework就有。 如上图&#xff0c;只要配置了三个箭头所指的方向&#xff0c;就能使用。 第一个单字段过滤 用户视图集中加上filterset_fields …

(done) 两个矩阵 “相似” 是什么意思?

参考视频&#xff1a;https://www.bilibili.com/video/BV1zu411673J/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料&#xff1a;https://baike.baidu.com/item/%E7%9B%B8%E4%BC%BC%E7%9F%A9%E9%98%B5/10369874?frge_a…

javaSE多态

文章目录 斜体样式1.1 面向对象三大特征 ?1.2 什么是多态 ?*斜体样式*1.3 多态的前提1.4 多态的成员访问特点1.5 多态的优缺点1.6 多态的转型1.7 多态的转型注意1.8 解决转型安全隐患 2 内部类2.1 内部类的分类什么是内部类 ?什么时候使用内部类 ?内部类分类 ? 2.2 成员内…

C#通过继承泛型类来分块显示学生的个人信息以及成绩信息

目录 一、涉及到的知识点 1.泛型类的继承 2.泛型类的可视化 &#xff08;1&#xff09;用UML图说明泛型类的可视化 &#xff08;2&#xff09;用实例说明泛型类的可视化 二、实例1 1.源码 2.生成效果 三、实例2 再发一个继承泛型类的应用案例。 一、涉及到的知识点 …

mac 安装H3C iNode + accessClient mac版

一、下载安装 官网下载地址 https://www.h3c.com/cn/Service/Document_Software/Software_Download/IP_Management/ 可以使用文末参考博文中的账号 yx800 密码 01230123登录下载 选择版本 下载 下载 H3C_iNode_PC_7.3_E0626.zip 文件后&#xff0c;解压下载到的PC端压缩包…

9.vue学习笔记(组件传递Props校验+组件事件-组件传递数据+组件事件-配合“v-model”使用)

文章目录 1.组件传递Props校验1.1.默认值1.2.必选项1.3.注意事项&#xff1a;props 是只读的 2.组件事件-组件传递数据2.1.温馨提示&#xff1a;组件之间传递数据的方案 3.组件事件-配合“v-model”使用 1.组件传递Props校验 Vue组件可以更细致地声明对传入的 props 的校验要求…