【Python百宝箱】Python测试工具大揭秘:从单元测试到Web自动化

前言

在现代软件开发中,测试是确保代码质量和稳定性的关键步骤。Python作为一门广泛应用的编程语言,拥有丰富的测试工具和库,从单元测试到Web自动化,覆盖了多个测试层面。本文将介绍一系列Python测试工具,帮助开发者选择适合项目需求的工具,提高代码的可靠性和可维护性。

欢迎订阅专栏:Python库百宝箱:解锁编程的神奇世界

文章目录

    • 前言
    • Python测试大揭秘:从单元到Web,打造稳固代码的利器
      • 1. **`unittest` / `pytest`**
        • 1.1 单元测试框架
          • 1.1.1 `unittest`示例
          • 1.1.2 `pytest`示例
        • 1.2 参数化测试
        • 1.3 测试固件
          • 1.3.1 `unittest`的`setUp`和`tearDown`
          • 1.3.2 `pytest`的Fixture
        • 1.4 测试覆盖率
          • 1.4.1 安装`coverage`
          • 1.4.2 使用`coverage`检测测试覆盖率
      • 2. **`nose2`**
        • 2.1 nose2测试框架
          • 2.1.1 `nose2`的安装
          • 2.1.2 `nose2`示例
          • 2.1.3 参数化测试
          • 2.1.4 插件扩展
      • 3. **`coverage`**
        • 3.1 代码覆盖率工具
          • 3.1.1 安装`coverage`
          • 3.1.2 使用`coverage`检测测试覆盖率
          • 3.1.3 生成HTML格式的覆盖率报告
          • 3.1.4 忽略特定文件或目录
          • 3.1.5 使用`coverage`与`pytest`结合
      • 4. **`mock`**
        • 4.1 模拟测试对象的库
          • 4.1.1 安装`mock`
          • 4.1.2 `mock`示例代码
          • 4.1.3 模拟属性和方法
          • 4.1.4 侧重点:隔离测试
          • 4.1.5 Mocking 外部依赖
      • 5. **`Faker`**
        • 5.1 生成测试数据的库
          • 5.1.1 安装`Faker`
          • 5.1.2 `Faker`示例代码
          • 5.1.3 `Faker`支持的数据类型
          • 5.1.4 本地化数据生成
          • 5.1.5 数据生成策略定制
          • 5.1.6 在测试中的应用
      • 6. **`Hypothesis`**
        • 6.1 基于属性的测试库
          • 6.1.1 安装`Hypothesis`
          • 6.1.2 `Hypothesis`示例代码
          • 6.1.3 策略和数据生成
          • 6.1.4 复杂属性和假设
          • 6.1.5 在实际项目中的应用
          • 6.1.6 与其他测试框架结合使用
      • 7. **`Selenium`**
        • 7.1 自动化浏览器操作的库
          • 7.1.1 安装`Selenium`
          • 7.1.2 `Selenium`示例代码
          • 7.1.3 元素定位和交互
          • 7.1.4 等待机制
          • 7.1.5 测试框架整合
          • 7.1.6 高级功能和浏览器兼容性
      • 8. **`requests-mock`**
        • 8.1 模拟HTTP请求响应的库
          • 8.1.1 安装`requests-mock`
          • 8.1.2 `requests-mock`示例代码
          • 8.1.3 模拟不同的HTTP方法和状态码
          • 8.1.4 模拟异常和超时
          • 8.1.5 在测试中的应用
    • 总结

Python测试大揭秘:从单元到Web,打造稳固代码的利器

1. unittest / pytest

1.1 单元测试框架

单元测试是一种测试方法,旨在验证程序的最小可测试单元(通常是函数或方法)的正确性。Python内置了unittest模块,提供了一个传统的面向对象的单元测试框架。此框架基于测试类和测试方法的概念,通过断言来验证代码的预期行为。

1.1.1 unittest示例

下面是一个使用unittest进行单元测试的示例:

import unittestdef add(x, y):return x + yclass TestAddFunction(unittest.TestCase):def test_add_positive_numbers(self):result = add(2, 3)self.assertEqual(result, 5)def test_add_negative_numbers(self):result = add(-2, 3)self.assertEqual(result, 1)if __name__ == '__main__':unittest.main()

在这个示例中,我们定义了一个简单的add函数,然后创建了一个继承自unittest.TestCase的测试类。测试类中包含了两个测试方法,分别测试了两种不同输入下的add函数的行为。unittest提供了多种断言方法,例如assertEqualassertTrue等,用于验证实际结果和期望结果是否一致。

1.1.2 pytest示例

pytest是另一个流行的测试框架,相比unittest更加简洁和灵活。使用pytest可以轻松编写并运行更具可读性的测试代码。

def add(x, y):return x + ydef test_add_positive_numbers():result = add(2, 3)assert result == 5def test_add_negative_numbers():result = add(-2, 3)assert result == 1

上述代码展示了相同的测试,但使用了pytest的语法。pytest使用assert语句进行断言,不需要继承特定的测试类。运行测试时,只需执行pytest命令即可自动发现并执行测试文件。

1.2 参数化测试

参数化测试是一种在单元测试中使用不同输入参数运行相同测试逻辑的方法。这在验证函数对多组输入的处理是否正确时非常有用。pytest通过@pytest.mark.parametrize装饰器提供了简洁的参数化测试支持。

import pytestdef add(x, y):return x + y@pytest.mark.parametrize("input_a, input_b, expected_result", [(2, 3, 5), (-2, 3, 1)])
def test_addition(input_a, input_b, expected_result):result = add(input_a, input_b)assert result == expected_result

在上述示例中,使用@pytest.mark.parametrize装饰器定义了多组输入参数和期望结果。pytest将自动为每组参数运行测试,并确保测试的全面性。

1.3 测试固件

测试固件是在执行测试前后进行一些准备和清理工作的机制。unittestpytest都提供了测试固件的支持。

1.3.1 unittestsetUptearDown

unittest中的测试固件可以通过setUptearDown方法实现,在每个测试方法执行前后执行相应的操作。

import unittestclass TestAddFunction(unittest.TestCase):def setUp(self):# 在每个测试方法执行前的准备工作print("Setting up test...")def tearDown(self):# 在每个测试方法执行后的清理工作print("Tearing down test...")def test_add_positive_numbers(self):result = add(2, 3)self.assertEqual(result, 5)def test_add_negative_numbers(self):result = add(-2, 3)self.assertEqual(result, 1)if __name__ == '__main__':unittest.main()
1.3.2 pytest的Fixture

pytest中,可以使用@pytest.fixture装饰器创建测试固件。固件可以灵活地用于在测试之前进行设置和之后进行清理。

import pytest@pytest.fixture
def setup_teardown_example():# 在测试之前的准备工作print("Setting up test...")# 返回固件的值yield "example_value"# 在测试之后的清理工作print("Tearing down test...")def test_example(setup_teardown_example):value = setup_teardown_exampleassert value == "example_value"

上述示例中,setup_teardown_example是一个固件函数,通过yield返回固件的值,并在yield之前和之后分别执行准备和清理工作。

1.4 测试覆盖率

测试覆盖率是一个衡量代码被测试程度的指标。coverage是一个用于测量测试覆盖率的工具。

1.4.1 安装coverage

使用以下命令安装coverage

pip install coverage
1.4.2 使用coverage检测测试覆盖率

在项目根目录下运行以下命令:

coverage run -m pytest

运行测试后,生成测试覆盖率报告:

coverage report -m

报告将显示每个文件的测试覆盖率百分比和详细的覆盖信息。

2. nose2

2.1 nose2测试框架

nose2是一个灵活的测试框架,支持unittest测试用例,同时提供了许多插件来扩展功能。相较于unittestnose2更加灵活,允许开发者更自由地组织和运行测试。

2.1.1 nose2的安装

使用以下命令安装nose2

pip install nose2
2.1.2 nose2示例

下面是一个简单的使用nose2的示例:

def multiply(x, y):return x * ydef test_multiply_positive_numbers():result = multiply(2, 3)assert result == 6def test_multiply_negative_numbers():result = multiply(-2, 3)assert result == -6

使用nose2运行测试:

nose2

nose2会自动发现并执行测试。通过插件系统,你可以根据需要添加更多功能,例如测试覆盖率、测试报告等。

2.1.3 参数化测试

nose2同样支持参数化测试。使用@nose2.tools.params装饰器可以很容易地定义多组参数。

from nose2.tools import paramsdef add(x, y):return x + y@params((2, 3, 5), (-2, 3, 1))
def test_addition(input_a, input_b, expected_result):result = add(input_a, input_b)assert result == expected_result

在上述示例中,@params装饰器定义了多组输入参数和期望结果。nose2会为每组参数执行测试,使得测试代码更具可读性和复用性。

2.1.4 插件扩展

nose2的插件系统允许你根据项目需求自定义测试框架的行为。例如,可以使用nose2--with-coverage选项来集成测试覆盖率:

nose2 --with-coverage

此命令将显示测试覆盖率报告,帮助你了解代码的测试程度。

3. coverage

3.1 代码覆盖率工具

coverage是用于度量代码覆盖率的工具,帮助识别哪些部分的代码没有被测试覆盖。

3.1.1 安装coverage

使用以下命令安装coverage

pip install coverage
3.1.2 使用coverage检测测试覆盖率

在项目根目录下运行以下命令,使用coverage运行测试:

coverage run -m pytest

运行测试后,生成测试覆盖率报告:

coverage report -m
3.1.3 生成HTML格式的覆盖率报告

coverage还支持生成HTML格式的覆盖率报告,提供更直观的可视化结果。运行以下命令生成HTML报告:

coverage html

打开生成的htmlcov/index.html文件即可查看详细的代码覆盖率情况。

3.1.4 忽略特定文件或目录

有时候,你可能希望忽略一些文件或目录,不计入测试覆盖率。可以通过在项目根目录下创建.coveragerc文件,配置需要忽略的文件或目录:

[run]
omit =*/virtualenvs/**/tests/*

上述配置表示忽略所有位于virtualenvstests目录下的文件。

3.1.5 使用coveragepytest结合

coverage可以与pytest结合使用,提供更全面的测试覆盖率信息。在运行pytest时,可以使用--cov选项指定要进行覆盖率分析的模块或目录:

pytest --cov=my_module

这将运行测试并生成关于my_module模块的测试覆盖率报告。

4. mock

4.1 模拟测试对象的库

在单元测试中,有时需要模拟对象以隔离被测代码。mock库提供了创建虚拟对象的方法。

4.1.1 安装mock

如果你使用的是 Python 3.3 及更早版本,你需要额外安装 mock 库:

pip install mock

从 Python 3.4 版本开始,mock库被添加到标准库中,因此在较新的 Python 版本中,你无需安装。

4.1.2 mock示例代码

下面是一个使用mock库的简单示例:

from unittest.mock import Mock# 创建一个虚拟对象
fake_object = Mock()# 设置虚拟对象的行为
fake_object.method.return_value = 42# 在被测代码中使用虚拟对象
result = fake_object.method()
print(result)  # 输出: 42

在这个示例中,我们使用 Mock 类创建了一个虚拟对象 fake_object。然后,通过 fake_object.method.return_value,我们设置了虚拟对象的方法 method 的返回值为 42。最后,在被测代码中,我们调用了虚拟对象的方法,并打印了结果。

4.1.3 模拟属性和方法

mock库允许模拟对象的属性和方法。以下是一个模拟对象属性和方法的示例:

from unittest.mock import Mock# 创建一个虚拟对象
fake_object = Mock()# 模拟对象的属性
fake_object.attribute = 'mocked_attribute'
print(fake_object.attribute)  # 输出: mocked_attribute# 模拟对象的方法
fake_object.method.return_value = 'mocked_method'
result = fake_object.method()
print(result)  # 输出: mocked_method

在这个示例中,我们模拟了对象的属性 attribute 和方法 method

4.1.4 侧重点:隔离测试

mock库的关键优势之一是它可以帮助隔离测试。通过模拟对象的行为,你可以确保被测代码仅依赖于被直接测试的功能,而不受外部因素的影响。

4.1.5 Mocking 外部依赖

在实际单元测试中,mock库常用于模拟外部依赖,例如数据库访问、API调用等。这有助于确保测试的独立性,即使外部服务不可用也能进行测试。

from unittest.mock import Mock, patchdef fetch_data_from_api():# 实际的 API 调用# ...def my_function_using_api():data = fetch_data_from_api()# 处理从 API 获取的数据return data# 使用 patch 来模拟 API 调用
with patch('__main__.fetch_data_from_api') as mock_fetch:mock_fetch.return_value = {'key': 'value'}result = my_function_using_api()print(result)  # 输出: {'key': 'value'}

在这个示例中,patch函数用于模拟 fetch_data_from_api 函数,确保测试的独立性。这种方法允许在测试过程中忽略外部依赖的具体实现。

5. Faker

5.1 生成测试数据的库

在测试过程中,生成真实且多样的测试数据是很重要的。Faker库能够生成各种类型的假数据。

5.1.1 安装Faker

使用以下命令安装Faker

pip install Faker
5.1.2 Faker示例代码

下面是一个使用Faker库的简单示例:

from faker import Fakerfake = Faker()# 生成随机姓名
name = fake.name()
print(name)# 生成随机地址
address = fake.address()
print(address)

在这个示例中,我们首先创建了一个 Faker 实例 fake。然后,通过调用 fake.name()fake.address() 方法,我们生成了随机的姓名和地址。

5.1.3 Faker支持的数据类型

Faker支持生成多种类型的假数据,包括但不限于:

  • 随机姓名:fake.name()
  • 随机地址:fake.address()
  • 随机文本:fake.text()
  • 随机邮箱:fake.email()
  • 随机日期:fake.date_of_birth()
5.1.4 本地化数据生成

Faker还支持本地化数据生成,以确保生成的假数据符合特定地区的语言和习惯。

from faker import Faker# 创建一个带有特定语言和区域设置的 Faker 实例
fake = Faker('zh_CN')# 生成随机姓名(中文)
name = fake.name()
print(name)

在这个示例中,我们创建了一个使用中文语言和区域设置的 Faker 实例,然后生成了中文的随机姓名。

5.1.5 数据生成策略定制

Faker允许你定制数据生成策略,以满足特定的需求。你可以通过继承 Faker.Provider 类来创建自定义的数据生成器。

from faker import Faker
from faker.providers import BaseProviderclass MyProvider(BaseProvider):def custom_data(self):# 自定义数据生成逻辑return "Custom Data"# 添加自定义数据生成器
fake = Faker()
fake.add_provider(MyProvider)# 使用自定义数据生成器
custom_data = fake.custom_data()
print(custom_data)

在这个示例中,我们创建了一个自定义数据生成器 MyProvider,并通过 fake.add_provider(MyProvider) 将其添加到 Faker 实例中。然后,我们通过 fake.custom_data() 使用了自定义数据生成器。

5.1.6 在测试中的应用

在测试中使用 Faker 可以帮助生成丰富、真实的测试数据,提高测试的覆盖范围。例如,在测试数据库操作时,可以使用 Faker 生成随机的姓名、地址等字段值,以确保数据库操作的正确性和鲁棒性。

6. Hypothesis

6.1 基于属性的测试库

Hypothesis是一个基于属性的测试库,它能够自动生成测试用例来检查代码的行为。

6.1.1 安装Hypothesis

使用以下命令安装Hypothesis

pip install hypothesis
6.1.2 Hypothesis示例代码

下面是一个使用Hypothesis的简单示例:

from hypothesis import given
from hypothesis.strategies import integers@given(integers(), integers())
def test_addition_commutes(x, y):assert x + y == y + x

在这个示例中,我们使用 @given 装饰器来定义测试函数 test_addition_commutes,并使用 integers() 策略来生成两个整数 xyHypothesis会自动运行该测试,并生成大量的测试数据,以确保满足测试用例中定义的属性。

6.1.3 策略和数据生成

Hypothesis使用策略(strategies)来定义测试数据的生成规则。除了整数,还可以使用各种内置策略或组合策略来生成不同类型的数据。

from hypothesis import given
from hypothesis.strategies import text, lists@given(text(), lists(integers()))
def test_example(text_data, list_data):# 测试逻辑...

在这个示例中,我们使用 text() 策略生成字符串类型的数据,使用 lists(integers()) 策略生成整数列表类型的数据。

6.1.4 复杂属性和假设

Hypothesis支持定义复杂的属性和假设,以进一步精确地指导测试数据的生成。通过 assume 函数,你可以添加自定义的假设条件。

from hypothesis import given, assume
from hypothesis.strategies import integers@given(integers())
def test_positive_numbers(x):assume(x > 0)assert x > 0

在这个示例中,我们使用 assume 函数确保生成的整数 x 大于 0。

6.1.5 在实际项目中的应用

Hypothesis在实际项目中的应用非常广泛,特别是对于需要大量测试用例、测试边界条件的项目。通过定义简洁的属性和策略,Hypothesis能够自动发现潜在的问题,并帮助你编写更健壮、全面的测试。

6.1.6 与其他测试框架结合使用

Hypothesis可以与其他测试框架(如pytestunittest)结合使用,以提供更强大的测试支持。例如,结合 pytest 使用:

from hypothesis import given
from hypothesis.strategies import integers
import pytest@given(integers())
def test_positive_numbers(x):assert x > 0if __name__ == '__main__':pytest.main()

7. Selenium

7.1 自动化浏览器操作的库

Selenium是一个用于自动化浏览器操作的库,广泛用于进行Web界面测试。

7.1.1 安装Selenium

使用以下命令安装Selenium

pip install selenium

同时,你需要下载相应浏览器的驱动程序(如ChromeDriver)并确保它在系统的PATH中。

7.1.2 Selenium示例代码

下面是一个使用Selenium的简单示例:

from selenium import webdriver# 创建浏览器对象
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 执行一些操作,如点击按钮、填写表单等# 关闭浏览器
driver.quit()

在这个示例中,我们首先创建了一个 webdriver.Chrome() 实例,表示使用Chrome浏览器。然后,使用 driver.get("https://www.example.com") 打开了一个网页。在实际测试中,你可以执行各种操作,如点击按钮、填写表单等。

7.1.3 元素定位和交互

Selenium提供了丰富的方法来定位页面元素,并与这些元素进行交互。例如,通过find_element_by_xpath方法定位元素:

# 定位元素并点击
button = driver.find_element_by_xpath("//button[@id='submit-button']")
button.click()# 定位文本框并输入文本
input_box = driver.find_element_by_name("username")
input_box.send_keys("example_user")
7.1.4 等待机制

在Web界面测试中,页面元素可能需要时间加载,Selenium提供了等待机制来应对这种情况。例如,使用WebDriverWait等待某个元素出现:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素出现
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "example-element"))
)
7.1.5 测试框架整合

Selenium可以与各种测试框架(如unittestpytest)整合使用,以便更好地管理测试用例。以下是一个使用pytest的简单示例:

import pytest
from selenium import webdriver@pytest.fixture
def browser():driver = webdriver.Chrome()yield driverdriver.quit()def test_example(browser):browser.get("https://www.example.com")assert "Example Domain" in browser.title
7.1.6 高级功能和浏览器兼容性

Selenium支持许多高级功能,如浏览器的无头模式、浏览器的多窗口管理等。同时,你可以选择使用不同的浏览器驱动程序(如Firefox、Edge等)来适应不同的需求。

8. requests-mock

8.1 模拟HTTP请求响应的库

在进行API测试时,经常需要模拟HTTP请求以确保代码在不同网络条件下的行为。requests-mock是一个方便的工具。

8.1.1 安装requests-mock

使用以下命令安装requests-mock

pip install requests-mock
8.1.2 requests-mock示例代码

下面是一个使用requests-mock的简单示例:

import requests
from requests_mock import Mockerwith Mocker() as mocker:# 设置模拟的响应mocker.get('https://api.example.com/data', text='Mocked Response')# 发起HTTP请求response = requests.get('https://api.example.com/data')# 断言请求的响应assert response.text == 'Mocked Response'

在这个示例中,我们使用 requests-mockMocker 上下文管理器来模拟HTTP请求和响应。通过 mocker.get 方法设置了对特定URL的GET请求的模拟响应。然后,我们使用 requests.get 发起了实际的HTTP请求,并通过断言确保了得到了模拟的响应。

8.1.3 模拟不同的HTTP方法和状态码

requests-mock支持模拟不同的HTTP方法(GET、POST、PUT等)和状态码。以下是一个示例:

import requests
from requests_mock import Mockerwith Mocker() as mocker:# 模拟POST请求和自定义状态码mocker.post('https://api.example.com/data', text='Created', status_code=201)# 发起POST请求response = requests.post('https://api.example.com/data')# 断言请求的响应和状态码assert response.text == 'Created'assert response.status_code == 201
8.1.4 模拟异常和超时

在测试中,有时需要模拟HTTP请求的异常和超时情况。requests-mock可以轻松应对这些情况:

import requests
from requests_mock import Mockerwith Mocker() as mocker:# 模拟请求超时mocker.get('https://api.example.com/timeout', exc=requests.exceptions.Timeout)try:# 发起GET请求response = requests.get('https://api.example.com/timeout')except requests.exceptions.Timeout as e:# 处理超时异常print(f"Request timed out: {e}")
8.1.5 在测试中的应用

在进行API测试时,使用 requests-mock 可以方便地模拟不同的场景,包括正常响应、异常、超时等,以确保代码在各种情况下的稳健性。

总结

通过本文的介绍,读者将对Python中丰富的测试工具有更全面的了解。从编写单元测试到模拟测试对象,再到生成测试数据和进行Web界面测试,每个工具都有其独特的优势。选择适合项目需求的测试工具,将有助于提高代码质量、减少错误和提升开发效率。希望本文对读者在Python开发中的测试实践提供有益的指导和启示。

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

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

相关文章

计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

日志门面slf4j与常用的日志框架Log4j,Logback和Log4j2

slf4j 是众多日志框架接口的集合(俗称日志门面),它不负责具体的日志实现,只在编译时负责寻找合适的日志框架进行绑定,各日志框架通过扩展jar包中的适配器与slf4j建立适配 SLF4J可以和Log4j、Logback、Log4j2、JUL等日志框架配合使用,这里主要…

【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

文章目录 一、类模板 - 函数声明与函数实现分离1、类模板 外部 实现 构造函数2、类模板 外部 实现 普通函数3、类模板 外部 实现 友元函数( 1 ) 错误示例及分析 - 类模板 的 外部友元函数 二次编译 问题( 2 ) 正确写法 二、代码示例 - 函数声明与函数实现分离1、代码示例2、执行…

go同步锁 sync mutex

goroutine http://127.0.0.1:3999/concurrency/11 go tour 到此 就结束了. 继续 学习 可以 从 以下网站 文档 https://golang.org/doc/ https://golang.org/doc/code https://golang.org/doc/codewalk/functions/ 博客 https://go.dev/blog/ wiki 服务器教程 服务器…

level=warning msg=“failed to retrieve runc version: signal: segmentation fault“

安装docker启动后,发现里面没有runc版本信息 目前看是少了runc组件 那我们安装runc https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64 [rootlocalhost ~]# mv runc.amd64 /usr/bin/runc mv:是否覆盖"/usr/bin/runc&q…

Git 分支管理

目录 列出分支 删除分支 分支合并 合并冲突 几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。 使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。 Git 分支实际上是指向更改快照的指针。 有…

CAXA同一个窗口打开文件

重新关联,工具,文件关联工具

文档 + 模型

文档 模型 0: 基于MATLAB的soc锂电池系统设计 1: 电力系统继电保护仿真设计-毕业论文 2: 继电保护仿真-三段式电流保护的方案设计及分析-相间短路 3: 直流电机双闭环控制系统 转速电流双闭环调速 4: matlab电力系统继电保护仿真 三段电流保护仿真-双侧电源系统 5: OFDM-MIMO课…

python实现FINS协议的TCP服务端(篇二)

python实现FINS协议的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模块。本文为第二篇。

修复dinput8.dll丢失的简单方法,解决dinput8.dll丢失

在使用电脑时,电脑可能会出现一些特殊的情况,比如电脑中出现关于dinput8.dll丢失会找不到的情况,出现这样的情况可能会不知道该怎么办,但是出现这样的情况其实并不是一件很难解决的事情,修复dinput8.dll丢失方法也是比…

Delphi 取消与设置CDS本地排序

取消与设置CDS本地排序 取消CDS本地排序. cds.IndexDefs.Update; if cds.IndexName<> then begin if cds.IndexDefs.IndexOf(index1)>0 then cds.DeleteIndex(index1); cds.IndexDefs.Clear; cds.IndexName:; end; 设置CDS本地排序 c…

Robust Optimization, imperfect CSI, CSIT and CSIR

文章目录 写在前面CSI, CSIT and CSIR 写在前面 CSIT或者CSIR可不可以用来帮助实现隐蔽通信 人工噪声让窃听者估计出错误的信道。 CSI, CSIT and CSIR MIMO Minimum Total MSE Transceiver Design With Imperfect CSI at Both Ends 2009 TSP 多输入多输出 (MIMO) 系统已成为…

MySQL InnoDB 引擎底层解析(二)

6.2.InnoDB 的表空间 表空间是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个页的池…

关于Unity Time.deltaTime的理解和使用

Unity中的Time.deltaTime是一个表示上一帧到当前帧所用时间的浮点数。 它可以让Unity应用程序能够以平滑的方式在不同的帧率下运行。 要深刻理解Time.deltaTime&#xff0c;首先得了解Unity引擎得工作原理。 Unity引擎以每秒帧数&#xff08;FPS&#xff09;的形式运行。 比…

基于tcp协议及数据库sqlite3的云词典项目

这个小项目是一个网络编程学习过程中一个阶段性检测项目&#xff0c;过程中可以有效检测我们对于服务器客户端搭建的能力&#xff0c;以及一些bug查找能力。项目的一个简单讲解我发在了b站上&#xff0c;没啥心得&#xff0c;多练就好。 https://t.bilibili.com/86524470252640…

Shell判断:模式匹配:case(二)

简单的JumpServer 1、需求&#xff1a;工作中&#xff0c;我们需要管理N多个服务器。那么访问服务器就是一件繁琐的事情。通过shell编程&#xff0c;编写跳板程序。当我们需要访问服务器时&#xff0c;看一眼服务器列表名&#xff0c;按一下数字&#xff0c;就登录成功了。 2、…

JAVA毕业设计111—基于Java+Springboot+Vue的养老院管理系统(源码+数据库+12000字论文)

基于JavaSpringbootVue的养老院管理系统(源码数据库12000字论文)111 一、系统介绍 本系统前后端分离&#xff0c;本系统分为销售、人事、服务、餐饮、财务、超级管理员六种角色 系统主要功能如下&#xff1a; 首页统计&#xff1a;包括今日新增咨询、今日新增预定、今日新增…

AI资讯--Meta AI工具“指哪打哪“;OpenAI CEO事件梳理;

看点 Meta展示全新AI图像编辑工具&#xff1a;文本指令“指哪打哪”&#xff0c;主体背景都能换 &#x1f3a8;OpenAI CEO被董事会罢免36小时事件梳理 &#x1f552;OpenAI开掉了最能搞钱的创始人&#xff0c;GPT在他手里可能失控&#xff1f; &#x1f4b8;微软和兴盛资本向O…

树与二叉树堆:堆

堆的概念&#xff1a; 一般是把数组的数据在逻辑结构上看成一颗完全二叉树&#xff0c;如下图所示。 注意&#xff1a;别将C语言中的堆和数据结构的堆混为一谈&#xff0c;本文所讲的数据结构的堆是一种完全二叉树&#xff0c;而C语言中的堆其实是一种内存区域的划分 堆的分类…

Java语言基础第五天

精华笔记&#xff1a; 循环结构&#xff1a; for结构&#xff1a;应用率最高&#xff0c;与次数相关的循环 三种结构如何选择&#xff1a; 先看循环是否与次数相关&#xff1a; 若相关-----------------------------直接上for 若无关&#xff0c;再看要素1与要素3的代码是否相…