当前位置: 首页 > news >正文

Python--测试代码

目录

1、使用pip安装pytest

1.1 更新pip

1.2 安装putest

2、测试函数

2.1 单元测试和测试用例

2.2 可通过的测试

2.3 运行测试

2.4 未通过的测试

2.5 解决测试未通过

2.6 添加新测试

3、测试类

3.1 各种断言

3.2 一个测试的类

3.3 测试AnonymousSurvey类

3.4 使用夹具


在编写函数或类时,还可为其编写测试。通过测试,可确定代码⾯对 各种输⼊都能够按要求⼯作。

1、使用pip安装pytest

第三⽅包(third-party package)指的是独⽴于 Python 核 ⼼的库。

然⽽,很多包并未被纳⼊标准库,因此得以独⽴于 Python 语⾔本⾝的更新 计划。为很多重要的功能是使⽤第三⽅包实 现的。

1.1 更新pip

Python 提供了⼀款名为 pip 的⼯具,可⽤来安装第三⽅包。因为 pip 帮我们

安装来⾃外部的包,所以更新频繁,以消除潜在的安全问题。有鉴于此,

我们先来更新 pip。

打开⼀个终端窗⼝,执⾏如下命令:

$ python -m pip install --upgrade pip 
❶ Requirement already satisfied: pip in /.../python3.11/site-packages 
(22.0.4) 
--snip-- 
❷ Successfully installed pip-22.1.2 

可使⽤下⾯的命令更新系统中安装的任何包:

$ python -m pip install --upgrade package_name

1.2 安装putest

将 pip 升级到最新版本后,就可以安装 pytest 了:

$ python -m pip install --user pytest 
Collecting pytest 
--snip-- 
Successfully installed attrs-21.4.0 iniconfig-1.1.1 ...pytest-7.x.x 

这⾥使⽤的核⼼命令也是 pip install,但指定的标志不是 --upgrade,⽽是 --user。这个标志让 Python 只为当前⽤户装指定的 包。

可使⽤下⾯的命令安装众多的第三⽅包:

$ python -m pip install --user package_name 

注意:如果在执⾏这个命令时遇到⿇烦,可尝试在不指定标志 --user 的情况下再次执⾏它。

2、测试函数

要学习测试,必须有要测试的代码。下⾯是⼀个简单的函数,它接受名和 姓并返回格式规范的姓名:

def get_formatted_name(first, last): """⽣成格式规范的姓名""" full_name = f"{first} {last}" return full_name.title()

我们编写⼀个使⽤这个 函数的程序。程序 names.py 让⽤户输⼊名和姓,并显⽰格式规范的姓名:

from name_function import get_formatted_name 
print("Enter 'q' at any time to quit.") 
while True: first = input("\nPlease give me a first name: ") if first == 'q': break last = input("Please give me a last name: ") if last == 'q': break formatted_name = get_formatted_name(first, last) print(f"\tNeatly formatted name: {formatted_name}.") 

这个程序从 name_function.py 中导get_formatted_name()。⽤户可 输⼊⼀系列名和姓,并看到格式规范的姓名:

Enter 'q' at any time to quit. 
Please give me a first name: janis 
Please give me a last name: joplin Neatly formatted name: Janis Joplin.Please give me a first name: bob 
Please give me a last name: dylan Neatly formatted name: Bob Dylan. 
Please give me a first name: q 

从上述输出可知,合并得到的姓名正确⽆误。

现在假设要修改 get_formatted_name(),使其还能够处理中间名。为此,可在每 次修get_formatted_name() 后都进⾏测试:运⾏程序 names.py,并 输⼊像 Janis Joplin 这样的姓名。不过这太烦琐了。所幸 pytest 提供了⼀ 种⾃动测试函数输出的⾼效⽅式。

2.1 单元测试和测试用例

测试⽤例(test case)是⼀组单元测试, 这些单元测试⼀道核实函数在各种情况下的⾏为都符合要求。良好的测试 ⽤例考虑到了函数可能收到的各种输⼊,包含针对所有这些情况的测试。

全覆盖(full coverage)测试⽤例包含⼀整套单元测试,涵盖了各种可能的 函数使⽤⽅式。

2.2 可通过的测试

使⽤ pytest 进⾏测试,会让单元测试编写起来⾮常简单。我们将编写⼀ 个测试函数,它会调⽤要测试的函数,并做出有关返回值的断⾔。如果断 ⾔正确,表⽰测试通过;如果断⾔不正确,表⽰测试未通过。

这个针对 get_formatted_name() 函数的测试如下:

from name_function import get_formatted_name
❶ def test_first_last_name():"""能够正确地处理像 Janis Joplin 这样的姓名吗?"""
❷ formatted_name = get_formatted_name('janis', 'joplin')
❸ assert formatted_name == 'Janis Joplin'

测试⽂件的名称很重要,必须以 test_打头。当你让 pytest 运⾏测试时,它将查找以 test_打头的⽂件,并 运⾏其中的所有测试。

在这个测试⽂件中,⾸先导⼊要测试的get_formatted_name() 函数。 然后,定义⼀个测试函数 test_first_last_name()(⻅❶)。

这个函 数名⽐以前使⽤的都⻓,原因有⼆。

第⼀,测试函数必须以 test_ 打头。在测试过程中,pytest 将找出并运⾏所有以 test_ 打头的函数。

第⼆, 测试函数的名称应该⽐典型的函数名更⻓,更具描述性。你⾃⼰不会调⽤ 测试函数,⽽是由 pytest 替你查找并运⾏它们。因此,测试函数的名称 应⾜够⻓,让你在测试报告中看到它们时,能清楚地知道它们测试的是哪 些⾏为

接下来,调⽤要测试的函数(⻅❷)。像运⾏ names.py 时⼀样,这⾥在调 ⽤ get_formatted_name() 函数时向它传递了实参 'janis' 和 'joplin'。将这个函数的返回值赋给变量 formatted_name。

最后,做出⼀个断⾔(⻅❸)。断⾔(assertion)就是声称满⾜特定的条 件:这⾥声称 formatted_name 的值为 'Janis Joplin'。

2.3 运行测试

打开⼀个终端窗⼝,并切换到这个测试⽂件所在的⽂件夹。如果你

使⽤的是 VS Code,可打开测试⽂件所在的⽂件夹,并使⽤该编辑器内嵌

的终端。在终端窗⼝中执⾏命令 pytest,你将看到如下输出:

$ pytest ========================= test session starts 
========================= 
❶ platform darwin -- Python 3.x.x, pytest-7.x.x, pluggy-1.x.x 
❷ rootdir: /.../python_work/chapter_11 
❸ collected 1 item 
❹ test_name_function.py . 
[100%] ========================== 1 passed in 0.00s 
==========================

⼀些有关运⾏测试的系统的 信息(⻅❶)。该测试是从哪个⽬录运⾏的(⻅❷)pytest 找到了⼀个测试(⻅❸),并 指出了运⾏的是哪个测试⽂件(⻅❹)

注意:如果出现⼀条消息,提⽰没有找到命令 pytest,请执⾏命 令 python -m pytest

2.4 未通过的测试

修改

get_formatted_name(),使其能够处理中间名,但同时故意让这个函

数⽆法正确地处理像 Janis Joplin 这样只有名和姓的姓名。

下⾯是 get_formatted_name() 函数的新版本,它要求通过⼀个实参指

定中间名:

def get_formatted_name(first, middle, last): """⽣成格式规范的姓名""" 
full_name = f"{first} {middle} {last}" return full_name.title()

对其进⾏测试时,我

们发现它不再能正确地处理只有名和姓的姓名了。

这次运⾏ pytest 时,输出如下:

 $ pytest ========================= test session starts 
========================= 
--snip-- 
❶ test_name_function.py F 
[100%] 
❷ ============================== FAILURES 
=============================== 
❸ ________________________ test_first_last_name 
_________________________ def test_first_last_name(): """能够正确地处理像 Janis Joplin 这样的姓名吗?""" 
❹ > formatted_name = get_formatted_name('janis', 'joplin') 
❺ E TypeError: get_formatted_name() missing 1 required positional argument: 'last' test_name_function.py:5: TypeError ======================= short test summary info 
======================= FAILED test_name_function.py::test_first_last_name - TypeError: get_formatted_name() missing 1 required positional argument: 
'last' ========================== 1 failed in 0.04s 
==========================

输出中有⼀个字⺟ F(⻅❶),表明有⼀个测试未通过。然后是 FAILURES 部分(⻅❷),这是关注的焦点,因为在运⾏测试时,通常应 该关注未通过的测试。接下来,指出未通过的测试函数是 test_first_last_name()(⻅❸)。右尖括号(⻅❹)指出了导致测 试未能通过的代码⾏。下⼀⾏中的 E(⻅❺)指出了导致测试未通过的具体 错误:缺少必不可少的位置实参 'last',导致 TypeError。在末尾的简 短⼩结中,再次列出了最重要的信息。

2.5 解决测试未通过

如果检查的条件没错,那么测试通过意味 着函数的⾏为是对的,⽽测试未通过意味着你编写的新代码有错。因此, 在测试未通过时,不要修改测试。因为如果你这样做,即便能让测试通 过,像测试那样调⽤函数的代码也将突然崩溃。相反,应修复导致测试不 能通过的代码:检查刚刚对函数所做的修改,找出这些修改是如何导致函 数⾏为不符合预期的。

在这个⽰例中,新增的中间名参数是必不可少 的。就这⾥⽽⾔, 最佳的选择是让中间名变为可选的。

def get_formatted_name(first, last, middle=''): """⽣成格式规范的姓名""" 
if middle: 
full_name = f"{first} {middle} {last}" 
else: 
full_name = f"{first} {last}" return full_name.title()

2.6 添加新测试

确定 get_formatted_name() ⼜能正确地处理简单的姓名后,我们再编 写⼀个测试,⽤于测试包含中间名的姓名。为此,在⽂件 test_name_function.py 中添加⼀个测试函数:

 from name_function import get_formatted_namedef test_first_last_name():--snip--def test_first_last_middle_name():"""能够正确地处理像 Wolfgang Amadeus Mozart 这样的姓名吗?"""
❶ formatted_name = get_formatted_name('wolfgang', 'mozart', 'amadeus')
❷ assert formatted_name == 'Wolfgang Amadeus Mozart'

为测试 get_formatted_name() 函数,我们先使⽤名、姓和中间名调⽤ 它(⻅❶),再断⾔返回的姓名与预期的姓名(名、中间名和姓)⼀致 (⻅❷)。再次运⾏ pytest,两个测试都通过了:

 $ pytest ========================= test session starts 
========================= 
--snip-- collected 2 items 
❶ test_name_function.py .. 
[100%] ========================== 2 passed in 0.01s 
==========================

3、测试类

如果针 对类的测试通过了,你就能确信对类所做的改进没有意外地破坏其原有的 ⾏为。

3.1 各种断言

到⽬前为⽌,我们只介绍了⼀种断⾔:声称⼀个字符串变量取预期的值。 在编写测试时,可做出任何可表⽰为条件语句的断⾔。如果该条件确实成 ⽴,你对程序⾏为的假设就得到了确认,可以确信其中没有错误。测试中常⽤的断⾔语句

断⾔

⽤途

assert a == b

断⾔两个值相等

assert a != b

断⾔两个值不等

assert a

断⾔ a 的布尔求值为 True

assert not a

断⾔ a 的布尔求值为 False

assert element in list

断⾔元素在列表中

assert element not in list

断⾔元素不在列表中

这⾥列出的只是九⽜⼀⽑,测试能包含任意可⽤条件语句表⽰的断⾔。

3.2 一个测试的类

类的测试与函数的测试相似,所做的⼤部分⼯作是测试类中⽅法的⾏为。

这是⼀

个帮助管理匿名调查的类:

# survey.py class AnonymousSurvey: """收集匿名调查问卷的答案""" 
❶ def __init__(self, question): """存储⼀个问题,并为存储答案做准备""" self.question = question self.responses = [] 
❷ def show_question(self): """显⽰调查问卷""" print(self.question) 
❸ def store_response(self, new_response): """存储单份调查答卷""" self.responses.append(new_response) 
❹ def show_results(self): """显⽰收集到的所有答卷""" print("Survey results:") for response in self.responses: print(f"- {response}")

这个类⾸先存储⼀个调查问题(⻅❶),并创建了⼀个空列表,⽤于存储 答案。这个类包含打印调查问题的⽅法(⻅❷),在答案列表中添加新答 案的⽅法(⻅❸),以及将存储在列表中的答案打印出来的⽅法(⻅❹)。 要创建这个类的实例,只需提供⼀个问题即可。编写⼀个使⽤它的程 序:

# language_survey.py 
from survey import AnonymousSurvey 
# 定义⼀个问题,并创建⼀个表⽰调查的 AnonymousSurvey 对象 
question = "What language did you first learn to speak?" 
language_survey = AnonymousSurvey(question) 
# 显⽰问题并存储答案 
language_survey.show_question() 
print("Enter 'q' at any time to quit.\n") 
while True: response = input("Language: ") if response == 'q': break language_survey.store_response(response) 
# 显⽰调查结果 
print("\nThank you to everyone who participated in the survey!") 
language_survey.show_results()

3.3 测试AnonymousSurvey类

下⾯来编写⼀个测试,对 AnonymousSurvey 类的⾏为的⼀个⽅⾯进⾏验 证。

# test_survey.py from survey import AnonymousSurvey 
❶ def test_store_single_response(): """测试单个答案会被妥善地存储""" question = "What language did you first learn to speak?" 
❷ language_survey = AnonymousSurvey(question) language_survey.store_response('English') 
❸ assert 'English' in language_survey.responses

⾸先,导⼊要测试的 AnonymousSurvey 类。第⼀个测试函数验证:调查

问题的单个答案被存储后,它会包含在调查结果列表中。对于这个测试函

数,⼀个不错的描述性名称是 test_store_single_response()(⻅

❶)。如果这个测试未通过,我们就能通过测试⼩结中的函数名得知,在 存储单个调查答案⽅⾯存在问题。 要测试类的⾏为,需要创建其实例。在❷处,使⽤问题"What language did you first learn to speak?" 创建⼀个名language_survey 的实例,然后使⽤ store_response() ⽅法存储单个答案 English。接下来,通过断⾔ English 在列表

language_survey.responses 中,核实这个答案被妥善地存储了(⻅ ❸)。

$ pytest test_survey.py
========================= test session starts =========================
--snip--
test_survey.py . [100%]
========================== 1 passed in 0.01s ==========================

。下⾯来核实,当 ⽤户提供三个答案时,它们都将被妥善地存储。为此,再添加⼀个测试函 数:

from survey import AnonymousSurvey def test_store_single_response(): 
--snip-- 
def test_store_three_responses(): 
"""测试三个答案会被妥善地存储""" 
question = "What language did you first learn to speak?" 
language_survey = AnonymousSurvey(question) 
❶responses = ['English', 'Spanish', 'Mandarin'] 
for response in responses: 
language_survey.store_response(response) 
❷for response in responses: 
assert response in language_survey.responses 

我们将这个新函数命名为 test_store_three_responses(),并像 test_store_single_response() ⼀样,在其中创建⼀个调查对象。 先定义⼀个包含三个不同答案的列表(⻅❶),再对其中的每个答案都调⽤ store_response()。存储这些答案后,使⽤⼀个循环来断⾔每个答案 都包含在 language_survey.responses 中(⻅❷)。 再次运⾏这个测试⽂件,两个测试(针对单个答案的测试和针对三个答案 的测试)都通过了:

$ pytest test_survey.py 
========================= test session starts ========================= 
--snip-- 
test_survey.py .. [100%] 
========================== 2 passed in 0.01s ========================== 

前述做法的效果很好,但这些测试有重复的地⽅。下⾯使⽤ pytest 的另 ⼀项功能来提⾼效率。

3.4 使用夹具

在测试中,夹具(fixture)可帮助我们搭建测试环境。这通常意味着创建供 多个测试使⽤的资源。在 pytest 中,要创建夹具,可编写⼀个使⽤装饰 器 @pytest.fixture 装饰的函数。装饰器(decorator)是放在函数定义 前⾯的指令。在运⾏函数前,Python 将该指令应⽤于函数,以修改函数代 码的⾏为。下⾯使⽤夹具创建⼀个 AnonymousSurvey 实例,让 test_survey.py 中的两 个测试函数都可使⽤它:

import pytest from survey import AnonymousSurvey 
❶ @pytest.fixture 
❷ def language_survey(): 
"""⼀个可供所有测试函数使⽤的 AnonymousSurvey 实例"""question = "What language did you first learn to speak?" 
language_survey = AnonymousSurvey(question) 
return language_survey 
❸ def test_store_single_response(language_survey): """测试单个答案会被妥善地存储""" 
❹ language_survey.store_response('English') assert 'English' in language_survey.responses 
❺ def test_store_three_responses(language_survey): """测试三个答案会被妥善地存储""" responses = ['English', 'Spanish', 'Mandarin'] for response in responses: 
❻ language_survey.store_response(response) for response in responses: assert response in language_survey.responses

现在需要导⼊ pytest,因为我们使⽤了其中定义的⼀个装饰器。我们将装 饰器@pytest.fixture(⻅❶)应⽤于新函数language_survey() (⻅❷)。这个函数创建并返回⼀个AnonymousSurvey 对象。 请注意,两个测试函数的定义都变了(⻅❸和❺):都有⼀个名为 anguage_survey 的形参。当测试函数的⼀个形参与应⽤了装饰器

@pytest.fixture 的函数(夹具)同名时,将⾃动运⾏夹具,并将夹具 返回的值传递给测试函数。在这个⽰例中,language_survey() 函数向 test_store_single_response() 和

test_store_three_responses() 提供了⼀个 language_survey 实 例。 两个测试函数都没有新增代码,⽽且都删除了两⾏代码(⻅❹和❻):定义 问题的代码⾏,以及创建 AnonymousSurvey 对象的代码⾏。

相关文章:

Python--测试代码

目录 1、使用pip安装pytest 1.1 更新pip 1.2 安装putest 2、测试函数 2.1 单元测试和测试用例 2.2 可通过的测试 2.3 运行测试 2.4 未通过的测试 2.5 解决测试未通过 2.6 添加新测试 3、测试类 3.1 各种断言 3.2 一个测试的类 3.3 测试AnonymousSurvey类 3.4 使…...

CentOS 系列版本搭建 Nginx 服务

目录 Nginx 介绍 Nginx 安装 CentOS 系列版本 Nginx 删除 CentOS 系列版本 Nginx 介绍 Nginx 是一个广泛使用的Web服务器和反向代理服务器。 反向代理和负载均衡:Nginx支持反向代理和负载均衡,能够分发请求到多个后端服务器,提高了可用性…...

目标检测YOLO实战应用案例100讲-基于机器视觉的输电线路小目标检测和缺 陷识别(下)

目录 3.3.1 输电线路所有尺寸目标检测性能对比 3.3.2 输电线路小目标检测性能对比...

argparse--命令行参数解析库

文章目录 位置参数help ->描述信息type -> 被转换的类型 可选参数action ->动作基本类型 (store_true)短选项 结合位置参数和可选参数choiceaction ->动作基本类型 (count)default -> 默认值 argparse模块使编写用户友好的命令行变得容易 接口。程序定义了它需要…...

elasticsearch4-文档操作

个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…...

阿里云服务器上CentOS 7.6使用rpm包安装MySQL 8.0.31

我这里下载的是最新版本,需要到MySQL官网最新版本下载地址。 要是想要下载以前的版本需要到MySQL以前版本网址中。 1)先使用wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar(这个网址现在已经不…...

redis未授权漏洞

redis未授权漏洞是什么? Redis 默认情况下会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取 Redis的数据 它有什么危…...

详解3dMax中渲染线框的两种简单方法

在3dMax中渲染线框是你在某个时候想要完成的事情,例如为了演示分解步骤,或是仅仅为了在模型上创建线框覆盖的独特效果。为三维模型渲染线框最常见的原因是能够在模型上显示干净的拓扑。这篇文章将带你了解在3dMax中渲染三维模型线框的两种最常见、最简单…...

Git - Git 工作流程

文章目录 Git WorkFlow图解小结 Git WorkFlow Git Flow是一种基于Git的工作流程,确实利用了Git作为分布式版本控制系统的优势。 本地代码库 (Local Repository): 每个开发者都维护自己的本地代码库,这是Git分布式性质的体现。本地代码库包含了完整的项目…...

ARM如何利用PMU的Cycle Counter(时钟周期)来计算出CPU的时钟频率

本章将学习如何利用ARM PMU的Cycle Counter,来计算出CPU的时钟周期,从而计算出CPU的时钟频率。在介绍计算方法前,有必要先介绍下什么是时钟周期、机器周期以及指令周期。 如何计算出CPU的时钟频率 一,时钟周期,机器周…...

56资源网系统源码搭建知识付费-含源码

内置了上万条数据资源 大致功能: 支持免费与付费(增加了插件付费插件)支持侧边栏支持添加各类型广告(你所能用到的基本都有).支持网盘下载模块支持所有页面自定义支持文章页三方跳转支持添加页面支持自定义采集&#…...

【运营版】仿东郊到家上门服务app小程序开发同城美容家政预约推拿足浴SPA技师派单源码

套餐一:源码=小程序端+公众号端+APP端=280元 套餐二:全包服务 包服务器+域名+APP+认证小程序+H5+PC=1000元 后端:系统后端使用PHP语言开发 前端:前端使用uniapp进行前后端分离开发 用户端功能模块:技师选择 预约服务 优惠券 订单 技师服务...

uniapp项目实践总结(十五)使用websocket实现简易聊天室

导语:在一些社交软件中,经常可以看到各种聊天室的界面,接下来就总结一下聊天室的原理个实现方法,最后做一个简易的聊天室,包括登录/登出、加入/离开房间、发送接收聊天消息等功能。 目录 准备工作原理分析组件实现实战演练服务端搭建案例展示准备工作 在pages/index文件夹…...

论文阅读之Learning and Generalization of Motor Skills by Learning from Demonstration

论文阅读其实就是用自己的话讲一遍,然后理解其中的方法 0、论文基本信息 为什么阅读此篇论文:因为它是DMP经典论文,被引多次,学史可以明智,了解最初机理。 论文题目:Learning and Generalization of Moto…...

SpringCloud中的Eureka的集群配置

微服务框架中最为重要的就是注册中心,如果只是单注册中心,一旦出现问题,容易导致整个微服务环境不可用,所以建议注册中心集群。 目前SpringCloud框架中使用Eureka作为注册中心,本文简单介绍一下Eureka的集群配置&…...

10 Ubuntu下配置STMCubeMX与CLion IDE联合环境搭建(不包含下载CLion的教程)

序言 果然作为一名测控系的学生,纯搞视觉多少还是有点与专业脱节,决定入坑嵌入式。选择STM32进行入门,并且使用CubeMX加CLion作为我的第一个真正意义上的嵌入式开发环境(大一的时候玩过一段时间,但是没什么技术&#…...

负载均衡原理及应用

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

视频讲解|1033含sop的配电网重构(含风光可多时段拓展)

目录 1 主要内容 程序特点 讲解重点 2 视频链接 1 主要内容 该视频为含sop的配电网重构matlab代码讲解,对应资源下载链接为含sop的配电网重构(含风光|可多时段拓展),程序主要内容是:针对含sop的配电网重构模型&…...

uni-app监听页面滚动

在uni-app中可以通过监听页面滚动事件来实现滚动效果或响应滚动事件 在需要监听滚动的页面或组件中&#xff0c;添加一个scroll元素&#xff0c;用于容纳内容并实现滚动效果。 <template><view class"container"><scroll-view scroll-y scroll"…...

[字符串和内存函数]strcmp字符串函数的详解和模拟

strcmp函数 strcmp函数是一个用于比较两个字符串的C标准库函数。它的原型为&#xff1a; int strcmp(const char* str1, const char* str2);strcmp函数会比较str1和str2两个字符串的字符序列&#xff0c;并返回一个整数值来表示它们之间的大小关系。返回值的含义如下&#xff…...

zookeeper 常见问题处理

调整jvm参数 [rootvm-02 conf]# cat /opt/app/zookeeper-3.4.14/bin/zkEnv.sh |grep java.env -A3 -B3ZOOCFG"$ZOOCFGDIR/$ZOOCFG"if [ -f "$ZOOCFGDIR/java.env" ] then. "$ZOOCFGDIR/java.env" fiif [ "x${ZOO_LOG_DIR}" "x&…...

repo 命令

repo命令是Google开发的用于管理Android版本库的一个工具。 repo命令并不是用于取代git&#xff0c;而是用Python对git进行了一定的封装&#xff0c;简化了对多个Git版本库的管理。 repo init -u -b -m <manifest 文件名称> repo sync 相当于 git clone 获取 git remote…...

一、 计算机网络概论

一、计算机网络概论 1、计算机网络概述 1.1、概念 计算机网络是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统 是一些互连的、自治的计算机系统的集合 以能够相互共享资源的方…...

从零学习开发一个RISC-V操作系统(一)丨计算机组成原理相关知识与RISC-V指令集简介

本篇文章的内容 一、计算机组成原理的相关知识1.1 计算机的硬件组成1.2 程序的存储与执行1.3 程序语言的设计和进化1.4 存储设备的层次结构1.5 操作系统 二、RISC-V的指令集ISA简介2.1 什么是ISA2.2 复杂指令集&#xff08;CISC&#xff09;和精简指令集&#xff08;RISC&#…...

C++ - 异常介绍和使用

前言 我们在日常编写代码的时候&#xff0c;难免会出现编写错误带来程序的奔溃&#xff0c;或者是用户在使用我们编写的程序时候&#xff0c;使用错误所带来程序的奔溃。 在C 当中 可以对你觉得可能发生 错误 的地方在运行之前进行判断&#xff0c;发生错误可以给出提示。 C…...

iText实战--在现有PDF上工作

6.1 使用PdfReader读取PDF 检索文档和页面信息 D:/data/iText/inAction/chapter03/image_direct.pdf Number of pages: 1 Size of page 1: [0.0,0.0,283.0,416.0] Rotation of page 1: 0 Page size with rotation of page 1: Rectangle: 283.0x416.0 (rot: 0 degrees) Is reb…...

SQL优化--count优化

select count(*) from tb_user ;在之前的测试中&#xff0c;我们发现&#xff0c;如果数据量很大&#xff0c;在执行count操作时&#xff0c;是非常耗时的。 MyISAM 引擎把一个表的总行数存在了磁盘上&#xff0c;因此执行 count(*) 的时候会直接返回这个 数&#xff0c;效率很…...

IDEA下使用Spring MVC

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…...

2022基金从业人员资格管理及后续职业培训 部分答案(自答)

2022基金从业人员资格管理及后续职业培训 区块链在金融交易后处理中的应用私募基金行业典型违法案例分析《证券法》修订情况报告《刑法修正案&#xff08;十一&#xff09;》金融犯罪条款中国结算港股通结算业务介绍商品投资与商品配置价值气候技术&#xff1a;实现双碳目标的技…...

阿里云通义千问向全社会开放,近期将开源更大参数规模大模型

9月13日&#xff0c;阿里云宣布通义千问大模型已首批通过备案&#xff0c;并正式向公众开放&#xff0c;广大用户可登录通义千问官网体验&#xff0c;企业用户可以通过阿里云调用通义千问API。 通义千问在技术创新和行业应用上均位居大模型行业前列。IDC最新的AI大模型评估报告…...

专业建设外贸网站制作江门/站长之家ppt模板

-- Start 在上一篇中&#xff0c;我们学会了如何创建节点以及如何保存数据到节点中&#xff0c;那么什么是节点呢&#xff1f;其实节点就像文件一样&#xff0c;是用来保存数据的&#xff0c;只不过在 ZooKeeper 中&#xff0c;我们把它称之为节点。如果有成千上万个节点&…...

做网站引流做什么类型的网站最好/百度搜索量怎么查

1、明确需求 实战工作中经常会请求各种各样的接口&#xff0c;例如 •微信网页授权接口 • 高德周边检索接口 •发现&#xff1a;下图是根据接口文档开发后的代码&#xff0c;发现代码可读性差&#xff08;ps. 参数的作用不详&#xff09; • 解决&#xff1a;通过http_buil…...

中堂仿做网站/平面设计培训

1、加载父类&#xff0c;加载父类的静态属性和静态代码块 2、加载子类&#xff0c;加载子类的静态属性和静态代码块 3、初始化父类中的非静态属性并赋初值&#xff0c;执行父类非静态代码块&#xff0c;执行父类构造。 4、初始化子类中的非静态属性并赋初值&#xff0c;执行代码…...

怎么做网页 网站制作/朝阳seo

分组查询 语法为&#xff1a; SELECT "栏位1", SUM("栏位2") FROM "表格名" GROUP BY "栏位1"; 示范&#xff1a;算出每一间店 (Store_Name) 的营业额 (Sales) SELECT Store_Name, SUM(Sales) FROM Store_Information GROUP BY St…...

wordpress游戏插件下载/seo关键词有话要多少钱

使用EF实现多查询&#xff0c;暂未考虑性能问题 2015年10月6日22:26:51 正文 我在数据库有三个表&#xff0c;如下图&#xff1a; sysMenus与sysFunction有主外键关系&#xff0c;而sysUserInfo则与其他二表并无关联。 我现在使用这三个表针对多种情况使用EF实现多种查询手段 方…...

wordpress当前文章tags/自动的网站设计制作

危言 对金融危机最普遍的官方解释是次贷问题&#xff0c;然而次贷总共不过几千亿&#xff0c;而美国政府救市资金早已到了万亿以上&#xff0c;为什么危机还是看不到头&#xff1f;有文章指出危机的根源是 金融机构采用“杠杆”交易&#xff1b;另一些专家指出金融危机的背后是…...