智汇创想pytest接口自动化测试框架

        本测试框架是基于pytest搭建的接口自动化框架,对象为深圳智汇创想官方网站。深圳智汇创想科技有限责任公司(深圳智汇创想科技有限责任公司),是一家专注于跨境电子商务的集团公司,全球电商平台多品类多品牌的零售商,技术先进型服务企业,国家高新技术企业。一路走来,公司始终坚持以市场为导向、以客户需求及提升客户体验为目标,长期致力于自主设计、研发及创新,不断开发出高颜值、高品质、高性价比的产品,并努力打造中国品牌。

1、整体架构

整体用pytest+requests+allure+jenkins框架实现脚本编写。

项目框架有脚本层,配置层,报告层,公共方法层,数据层等。

script是脚本层;pytest.ini是配置文件;report是报告层,func是公共方法层,testdatafile是数据层。

2、脚本层

2.1 公司首页

打开网址,点击公司首页。F12抓包并写脚本如下

test_company_portal.py

这里用四种方法来做断言,分别是响应状态码,响应内容,响应头和响应长度。

# -- coding: utf-8 --
import time
import unittest2import os
import unittest
import requests
class TestZhcxkhPortal(unittest2.TestCase):def setUp(self):self.url = "https://www.zhcxkj.com/"def test_zhcxkj_portal(self):# 发送接口请求response = requests.get(self.url)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")# 2、断言响应内容# print(response.text)self.assertIn("深圳智汇创想科技有限责任公司", response.text)print("2响应内容断言成功")# 3、断言响应头:验证HTTP响应头是否包含特定的字段和值print(response.headers)self.assertIn("Content-Type", response.headers)print("3响应头断言成功")# 4、断言响应长度print(len(response.text))self.assertEqual(len(response.text),22393, msg="响应体中的项目数量不符合预期")print("4、响应断言长度(条数)成功!!")

执行结果如下:


============================= test session starts =============================
collecting ... collected 1 itemtest_company_portal.py::TestZhcxkhPortal::test_zhcxkj_portal 200
1响应状态码断言成功
2响应内容断言成功
{'Cache-Control': 'private', 'Pragma': 'no-cache', 'Content-Type': 'text/html; charset=utf-8', 'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'Server': 'Microsoft-IIS/7.5', 'Set-Cookie': 'PHPSESSID=9buhskd6crodp1o5t0g1svs561; path=/', 'X-Powered-By': 'ThinkPHP, ASP.NET', 'Date': 'Thu, 12 Sep 2024 08:30:13 GMT', 'Content-Length': '24699'}
3响应头断言成功
22393
4、响应断言长度(条数)成功!!
PASSED======================== 1 passed, 2 warnings in 0.39s ========================Process finished with exit code 0

2.2关于我们

关于我们有四个菜单,分别为

包含公司概况、企业文化、业务版图、公司社团,
在test_about_us.py 中定义了四个方法

具体代码如下:

# -- coding: utf-8 --
import time
import unittest2
from selenium import webdriver
from selenium.webdriver import ActionChains
import os
import unittest
import requests
import csv#关于我们接口,包含公司概况、企业文化、业务版图、公司社团
class TestAboutUs(unittest.TestCase):def setUp(self):self.url1 = "https://www.zhcxkj.com/index.php/Home/index/about/about_id/4.html"self.url2 = "https://www.zhcxkj.com/index.php/Home/index/about/about_id/7.html"self.url3 = "https://www.zhcxkj.com/index.php/Home/index/about/about_id/8.html"self.url4 = "https://www.zhcxkj.com/index.php/Home/index/about/about_id/9.html"# 关于我们--公司概况def test_about_company(self):# 发送接口请求response = requests.get(self.url1)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")# 2、断言响应内容# print(response.text)self.assertIn("深圳智汇创想科技有限责任公司", response.text)print("2响应内容断言成功")# 3、断言响应头:验证HTTP响应头是否包含特定的字段和值print(response.headers)self.assertIn("Content-Type", response.headers)print("3响应头断言成功")# 4、断言响应长度print(len(response.text))self.assertEqual(len(response.text),14919, msg="响应体中的项目数量不符合预期")print("4、响应断言长度(条数)成功!!")# 关于我们--企业文化def test_corporate_culture(self):# 发送接口请求response = requests.get(self.url2)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1test_about_joinus响应状态码断言成功")# 业务版图def test_Business_Landscape(self):# 发送接口请求response = requests.get(self.url3)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1test_about_joinus响应状态码断言成功")# 公司社团def test_Corporate_Societies(self):# 发送接口请求response = requests.get(self.url4)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1test_about_joinus响应状态码断言成功")

执行结果:

============================= test session starts =============================
collecting ... collected 4 itemstest_about_us.py::TestAboutUs::test_Business_Landscape 
test_about_us.py::TestAboutUs::test_Corporate_Societies 
test_about_us.py::TestAboutUs::test_about_company 
test_about_us.py::TestAboutUs::test_corporate_culture ======================== 4 passed, 8 warnings in 1.76s ========================Process finished with exit code 0
200
1test_about_joinus响应状态码断言成功
PASSED200
1test_about_joinus响应状态码断言成功
PASSED200
1响应状态码断言成功
2响应内容断言成功
{'Cache-Control': 'private', 'Pragma': 'no-cache', 'Content-Type': 'text/html; charset=utf-8', 'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'Server': 'Microsoft-IIS/7.5', 'Set-Cookie': 'PHPSESSID=thf56p7g0oo5v44ka4elqlmsl1; path=/', 'X-Powered-By': 'ThinkPHP, ASP.NET', 'Date': 'Thu, 12 Sep 2024 08:34:15 GMT', 'Content-Length': '16786'}
3响应头断言成功
14919
4、响应断言长度(条数)成功!!
PASSED200
1test_about_joinus响应状态码断言成功
PASSED

2.3 新闻中心

新闻中心有

公司动态、员工活动、员工培训、福利图签。
test_news.py中定义了这四个方法

具体接口代码实现:

# -- coding: utf-8 --
import time
import unittest2import os
import unittest
import requests
# 新闻中心:公司动态、员工活动、员工培训、福利图签。
class TestNews(unittest2.TestCase):def setUp(self):self.url = "https://www.zhcxkj.com/index.php/Home/index/news/parent_id/12.html"#公司动态、def test_Company_dynamics(self):# 发送接口请求response = requests.get(self.url)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")# 员工活动、def test_employee_activities(self):# 发送接口请求self.url="https://www.zhcxkj.com/index.php/Home/index/news/parent_id/14.html"response = requests.get(self.url)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")# 员工培训、def test_welfare_signs(self):# 发送接口请求self.url="https://www.zhcxkj.com/index.php/Home/index/news/parent_id/17.html"response = requests.get(self.url)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")# 福利图签。def test_Welfare_Pictorial(self):# 发送接口请求self.url="https://www.zhcxkj.com/index.php/Home/index/news/parent_id/31.html"response = requests.get(self.url)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")

执行结果:

============================= test session starts =============================
collecting ... collected 4 itemstest_news.py::TestNews::test_Company_dynamics 
test_news.py::TestNews::test_Welfare_Pictorial 
test_news.py::TestNews::test_employee_activities 
test_news.py::TestNews::test_welfare_signs ======================== 4 passed, 8 warnings in 1.39s ========================Process finished with exit code 0
200
1响应状态码断言成功
PASSED200
1响应状态码断言成功
PASSED200
1响应状态码断言成功
PASSED200
1响应状态码断言成功
PASSED

2.4 联系我们

联系我们只有一个类,包含一个方法

test_contact_us.py

代码如下:

# -- coding: utf-8 --
import time
import unittest2
import os
import unittest
import requests# 智汇有品界面
class TestContactUs(unittest2.TestCase):def setUp(self):self.url = "https://www.zhcxkj.com/index.php/Home/index/life.html"def test_life(self):# 发送接口请求response = requests.get(self.url)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")

响应如下:

============================= test session starts =============================
collecting ... collected 1 itemtest_contact_us.py::TestContactUs::test_life ======================== 1 passed, 2 warnings in 0.69s ========================Process finished with exit code 0
200
1响应状态码断言成功
PASSED

        2.5 智汇有品

只有一个类,包含一个方法

test_zhyp.py
# -- coding: utf-8 --
import time
import unittest2import os
import unittest
import requests
class TestZhyp(unittest2.TestCase):def setUp(self):self.url = "http://www.unixde.com/api/v1/stat/visit?site_id=60407&lang=en&k=72.1.0.0.0&u=http:%2F%2Fwww.unixde.com%2Fen"def test_Zhyp(self):# 发送接口请求response = requests.get(self.url)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")
============================= test session starts =============================
collecting ... collected 1 itemtest_zhyp.py::TestZhyp::test_Zhyp ============================== 1 passed in 0.16s ==============================Process finished with exit code 0
200
1响应状态码断言成功
PASSED

 2.5 正常登录test_loginV1.py

输入正常的用户名和密码进行登录

test_loginV1.py

代码如下:

# -- coding: utf-8 --
import time
import unittest2import os
import unittest
import requests
import json
class TestLogin(unittest2.TestCase):def setUp(self):self.url = "https://zhcxkj.com/backend/token/login"self.userinfo={}self.userinfo={"account":"1tenantId:soyotec:zhaot@163.comemail","password":"KZaHt2InubCNYziqF4JCGasg==","forceLogin":1,"lang":"cn","tenantId":1}# 将字典类型转化为json类型self.userjson = json.dumps(self.userinfo)def test_login(self):# 发送接口请求response=requests.post(self.url,data=self.userjson , headers={"Content-Type": "application/json;charset=UTF-8"})print(response)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")if __name__ == '__main__':# registobj=register_test()# registobj.registertest()unittest.main()

响应结果为:


============================= test session starts =============================
collecting ... collected 1 itemtest_loginV1.py::TestLogin::test_login <- ..\unixdeInterfacePytest\script\test_loginV1.py ======================== 1 passed, 2 warnings in 0.29s ========================Process finished with exit code 0
<Response [200]>
200
1响应状态码断言成功
PASSED

2.6 异常登录test_loginV2.py

包括总共5种情况

1、实现使用正确的用户名密码登录

2、使用错误的用户名正确的密码登录

3、使用正确的用户名错误的密码登录

4、使用正确用户名加空密码。并使用装饰器跳过执行。(会执行失败)

@unittest2.skipIf(3>2,'当条件为True时跳过测试')

5、使用空的用户名和正确的密码,会执行。

@unittest2.skipUnless(3 > 2, '当条件为True时执行测试')

代码如下:

# -- coding: utf-8 --
import time
import unittest2import os
import unittest
import requests
import jsonclass TestLogin(unittest2.TestCase):def setUp(self):self.url = "https://zhcxkj.com/backend/token/login"self.userinfo={}self.userinfo={"account":"1tenantId:soyotec:zhaot@163.comemail","password":"KZaHt2InubCNYziqF4JCGasg==","forceLogin":1,"lang":"cn","tenantId":1}# 将字典类型转化为json类型self.userjson = json.dumps(self.userinfo)# 定义一个函数,实现使用正确的用户名密码登录,最后需要进行断言,获取登录用户名判断是否为预期的zhaodahaidef test_01__login_by_correct_username_and_password(self):# 发送接口请求response = requests.post(self.url, data=self.userjson,headers={"Content-Type": "application/json;charset=UTF-8"})print(response)# 1、断言响应状态码print(response.status_code)self.assertEqual(200, response.status_code)print("1响应状态码断言成功")# self.assertEqual('', response.json()['message'])# 定义一个函数,实现使用错误的用户名正确的密码登录,最后需要进行断言,获取提示信息是否为预期的“User does not exist”def test_02_login_by_wrong_username_and_correct_password(self):# 发送接口请求userinfo={"account":"1tenantId:soyotec:zhaot@163.comemail","password":"KZaHt2InubCNYziqF4JCGasg==","forceLogin":1,"lang":"cn","tenantId":1}# 将字典类型转化为json类型userjson = json.dumps(userinfo)response = requests.post(self.url, data=userjson,headers={"Content-Type": "application/json;charset=UTF-8"})print(response.text)# 1、断言响应状态码print(response.status_code)self.assertEqual(500, response.status_code)print("1响应状态码断言成功")# 2、断言响应内容print(response.json()["code"])self.assertEqual(400, response.json()["code"])self.assertIn('User does not exist', response.json()['message'])print("2响应内容断言成功")# # 定义一个函数,实现使用正确的用户名错误的密码登录,最后需要进行断言,获取提示信息是否为预期的“If the login name or password is incorrect for 9 more times, the user will be locked for 1 minutes”def test_03_login_by_correct_username_and_wrong_password(self):# 发送接口请求userinfo={"account":"1tenantId:soyotec:zhaot@163.comemail","password":"KZaHt2InubCNYziqF4JCGasg==","forceLogin":1,"lang":"cn","tenantId":1}# 将字典类型转化为json类型userjson = json.dumps(userinfo)response = requests.post(self.url, data=userjson,headers={"Content-Type": "application/json;charset=UTF-8"})print(response.text)# 1、断言响应状态码print(response.status_code)self.assertEqual(500, response.status_code)print("1响应状态码断言成功")# 2、断言响应内容print(response.json()["code"])self.assertEqual(400, response.json()["code"])self.assertIn('If the login name or password is incorrect', response.json()['message'])print("2响应内容断言成功")#使用正确用户名加空密码@unittest2.skipIf(3>2,'当条件为True时跳过测试')def test_04_login_by_correct_username_and_null_password(self):# 发送接口请求userinfo={"account":"1tenantId:soyotec:zhaot@163.comemail","password":"KZaHt2InubCNYziqF4JCGasg==","forceLogin":1,"lang":"cn","tenantId":1}# 将字典类型转化为json类型userjson = json.dumps(userinfo)response = requests.post(self.url, data=userjson,headers={"Content-Type": "application/json;charset=UTF-8"})print(response.text)# 1、断言响应状态码print(response.status_code)self.assertEqual(500, response.status_code)print("1响应状态码断言成功")# 2、断言响应内容print(response.json()["code"])self.assertEqual(400, response.json()["code"])self.assertIn('If the login name or password is incorrect', response.json()['message'])print("2响应内容断言成功")@unittest2.skipUnless(3 > 2, '当条件为True时执行测试')def test_05_login_by_null_username_and_correct_password(self):# 发送接口请求userinfo={"account":"1tenantId:soyotec:zhaot@163.comemail","password":"KZaHt2InubCNYziqF4JCGasg==","forceLogin":1,"lang":"cn","tenantId":1}# 将字典类型转化为json类型userjson = json.dumps(userinfo)response = requests.post(self.url, data=userjson,headers={"Content-Type": "application/json;charset=UTF-8"})print(response.text)# 1、断言响应状态码print(response.status_code)self.assertEqual(500, response.status_code)print("1响应状态码断言成功")# 2、断言响应内容print(response.json()["code"])self.assertEqual(500, response.json()["code"])self.assertIn('操作失败,服务器异常', response.json()['message'])print("2响应内容断言成功")# 执行测试用例
if __name__=="__main__":unittest2.TextTestRunner()

执行结果如下:

============================= test session starts =============================
collecting ... collected 5 itemstest_loginV2.py::TestLogin::test_01__login_by_correct_username_and_password 
test_loginV2.py::TestLogin::test_02_login_by_wrong_username_and_correct_password 
test_loginV2.py::TestLogin::test_03_login_by_correct_username_and_wrong_password 
test_loginV2.py::TestLogin::test_04_login_by_correct_username_and_null_password 
test_loginV2.py::TestLogin::test_05_login_by_null_username_and_correct_password ================== 4 passed, 1 skipped, 8 warnings in 0.76s ===================Process finished with exit code 0
<Response [200]>
200
1响应状态码断言成功
PASSED{"code":400,"message":"User does not exist","data":null}
500
1响应状态码断言成功
400
2响应内容断言成功
PASSED{"code":400,"message":"If the login name or password is incorrect for 9 more times, the user will be locked for 1 minutes","data":null}
500
1响应状态码断言成功
400
2响应内容断言成功
PASSEDSKIPPED
Skipped: 当条件为True时跳过测试
{"code":500,"message":"操作失败,服务器异常","data":null}
500
1响应状态码断言成功
500
2响应内容断言成功
PASSED

2.7 数据驱动DDT test_loginV3.py

它会调用func文件夹的csvFileManager2.py 读取testdatafile里面的login_test_case.csv,并读取最后的状态码和数据做接口断言。

代码如下:

__author__ = 'Administrator'
import sys
sys.path.append("D:\\framework\\zhcxkjInterfacePytest")import time
from time import sleep
import unittest2
from func.csvFileManager2 import readerimport ddt
import osimport requests
import json@ddt.ddt #在类上面加一个装饰器,说明我们的这个类是一个数据驱动的测试的类
class TestLogin3(unittest2.TestCase):table = reader("login_test_case.csv")print(table)# table=table[0]# print(table)@ddt.data(*table)  #在类的上面加一个装饰器,说明我们的这个类是一个数据驱动的测试类def test_login(self,row):self.url = "https://zhcxkj.com/backend/token/login"self.userinfo={}self.userinfo={"account":row[0],"password":row[1],"forceLogin":row[2],"lang":row[3],"tenantId":row[4]}print(row[5])# 将字典类型转化为json类型self.userjson = json.dumps(self.userinfo)# 发送接口请求response = requests.post(self.url, data=self.userjson,headers={"Content-Type": "application/json;charset=UTF-8"})print(response.json())# 1、断言响应状态码print(response.status_code)print(row[5])self.assertEqual(int(row[5]), response.status_code)print(row[6])if response.json()['message'] is not None:self.assertIn(row[6], response.json()['message'])else:print(111)print("1响应状态码断言成功")# 执行测试用例
if __name__=="__main__":unittest2.TextTestRunner()

打印结果:

============================= test session starts =============================
collecting ... ../testdatafile/ind_interface/login_test_case.csv path
[['1409tenantId:soyotec:zhao_test@163.comemail', 'KZaHt2InubCNYziqF4JCGg==', '1', 'cn', '1409', '200', ''], ['1409tenantId:soyotec:zhao_test1@163.comemail', 'KZaHt2InubCNYziqF4JCGg==', '1', 'cn', '1409', '500', 'User does not exist'], ['1409tenantId:soyotec:zhao_test@163.comemail', 'KZaHt2InubCNYziqF4JCGg==1', '1', 'cn', '1409', '500', 'If the login name or password is incorrect'], ['1409tenantId:soyotec:zhao_test@163.comemail', '', '1', 'cn', '1409', '500', 'If the login name or password is incorrect'], ['', 'KZaHt2InubCNYziqF4JCGg==', '1', 'cn', '1409', '500', '操作失败,服务器异常']]
collected 5 itemstest_loginV3.py::TestLogin3::test_login_1___1409tenantId_soyotec_zhao_test_163_comemail____KZaHt2InubCNYziqF4JCGg______1____cn____1409____200______ <- ..\unixdeInterfacePytest\script\test_loginV3.py 
test_loginV3.py::TestLogin3::test_login_2___1409tenantId_soyotec_zhao_test1_163_comemail____KZaHt2InubCNYziqF4JCGg______1____cn____1409____500____User_does_not_exist__ <- ..\unixdeInterfacePytest\script\test_loginV3.py 
test_loginV3.py::TestLogin3::test_login_3___1409tenantId_soyotec_zhao_test_163_comemail____KZaHt2InubCNYziqF4JCGg__1____1____cn____1409____500____If_the_login_name_or_password_is_incorrect__ <- ..\unixdeInterfacePytest\script\test_loginV3.py 
test_loginV3.py::TestLogin3::test_login_4___1409tenantId_soyotec_zhao_test_163_comemail________1____cn____1409____500____If_the_login_name_or_password_is_incorrect__ <- ..\unixdeInterfacePytest\script\test_loginV3.py 
test_loginV3.py::TestLogin3::test_login_5_______KZaHt2InubCNYziqF4JCGg______1____cn____1409____500____操作失败_服务器异常__ <- ..\unixdeInterfacePytest\script\test_loginV3.py ======================= 5 passed, 10 warnings in 0.95s ========================Process finished with exit code 0
200
{'code': 200, 'message': None, 'data': {'access_token': '6227e889-63b2-4c10-8d31-97fa9f194bb3', 'token_type': 'bearer', 'refresh_token': '4e523eb2-eed2-4832-94b8-0be81bc9d389', 'expires_in': 43199, 'scope': 'server', 'loginHoldTime': '21600', 'sessionId': 'XpgrDCFpJlEJzvZP6E2w65JybmX1wYKHsDirCe-T'}}
200
200111
1响应状态码断言成功
PASSED500
{'code': 400, 'message': 'User does not exist', 'data': None}
500
500
User does not exist
1响应状态码断言成功
PASSED500
{'code': 400, 'message': 'If the login name or password is incorrect for 9 more times, the user will be locked for 1 minutes', 'data': None}
500
500
If the login name or password is incorrect
1响应状态码断言成功
PASSED500
{'code': 400, 'message': 'If the login name or password is incorrect for 8 more times, the user will be locked for 1 minutes', 'data': None}
500
500
If the login name or password is incorrect
1响应状态码断言成功
PASSED500
{'code': 500, 'message': '操作失败,服务器异常', 'data': None}
500
500
操作失败,服务器异常
1响应状态码断言成功
PASSED

3、Jenkins持续集成

新建一个Jenkins项目,Project zhcxkjInterfacePytest

进行配置

点击Build Now,进行执行,并生成测试报告。

执行成功,查看控制台

最后执行成功,21条通过,1个跳过。

4、生成Allure测试报告

到report下的index.html。右键Open In Browser Chrome,查看报告

可以看到,执行22条用例,测试用时4s 655ms,21条成功,1条跳过,成功率95.45%。

深圳智汇创想企业文化

企业使命:让中国智造走向世界

企业愿景:成为跨境电商行业领先者

企业价值观:尊重协作、务实高效、追求卓越、以奋斗者为本

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

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

相关文章

MATLAB | R2024b更新了哪些好玩的东西?

Hey, 又到了一年两度的MATLAB更新时刻&#xff0c;MATLAB R2024b正式版发布啦&#xff01;&#xff0c;直接来看看有哪些我认为比较有意思的更新吧! 1 小提琴图 天塌了&#xff0c;我这两天才写了个半小提琴图咋画&#xff0c;MATLAB 官方就出了小提琴图绘制方法。 小提琴图…

客户端负载均衡Ribbon实例

文章目录 一&#xff0c;概述二&#xff0c;实现过程三&#xff0c;项目源码1. 源码放送&#xff1a;2. 部署方式 四&#xff0c;功能演示五&#xff0c;其他 一&#xff0c;概述 一般来说&#xff0c;提到负载均衡&#xff0c;大家一般很容易想到浏览器 -> NGINX -> 反…

加密与安全_ sm-crypto 国密算法sm2、sm3和sm4的Java库

文章目录 Presm-crypto如何使用如何引入依赖 sm2获取密钥对加密解密签名验签获取椭圆曲线点 sm3sm4加密解密 Pre 加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签 sm-crypto https://github.com/antherd/sm-crypto 国密算法sm2、sm3和sm4的java版。基于js…

PMP--一模--解题--21-30

文章目录 9.资源管理21、 [单选] 项目经理发现一个不可预料的高影响风险已经成为项目的一个因素&#xff0c;团队成员之间的自身利益导致问题得不到解决&#xff0c;项目经理必须快速行动&#xff0c;让团队重新集中精力&#xff0c;以便项目恢复进度&#xff0c;项目经理应该使…

vue3项目实现全局国际化

本文主要梳理vue3项目实现全项目格式化&#xff0c;例如在我前面文章使用若依创建vue3的项目中&#xff0c;地址&#xff1a;若依搭建vue3项目在导航栏中切换&#xff0c;页面中所有的组件的默认语言随之切换&#xff0c;使用的组件库依旧是element-plus&#xff0c;搭配vue-i1…

09-排序1 排序(C)

这一节&#xff0c;测试各类排序算法的运行速度&#xff08;没有基数排序&#xff08;桶&#xff09; 其实在实际学习中&#xff0c;还是有意义的 给定 n 个&#xff08;长整型范围内的&#xff09;整数&#xff0c;要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序…

Windows与Linux下 SDL2的第一个窗口程序

Windows效果和Linux效果如下&#xff1a; 下面是代码&#xff1a; #include <stdio.h> #include "SDL.h"int main(int argc, char* argv[]) { // 初始化SDL视频子系统if (SDL_Init(SDL_INIT_VIDEO) ! 0){// 如果初始化失败&#xff0c;打印错误信息printf(&…

proteus+51单片机+实验(LCD1620、定时器)

目录 1.LCD1602液晶显示屏 1.1基本概念 1.1.1LCD的简介 1.1.2LCD的显示原理 ​​​1.1.3LCD的硬件电路 1.1.4LCD的常见指令 1.1.5LCD的时序 ​​​​​​​1.2代码 1.2.1写命令和写数据操作 1.2.2初始化和测试代码 1. 3.3功能函数 1.3proteus代码 1.3.1器件代码 1.…

探索Python世界的隐藏宝石:Pika库的神秘力量

文章目录 探索Python世界的隐藏宝石&#xff1a;Pika库的神秘力量背景&#xff1a;为何选择Pika&#xff1f;Pik库简介如何安装Pika&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python世界的隐藏宝石&#xff1a;Pika库的神秘力量 背景&#xff1a;为何…

ELK预警方案:API+XXLJob

目录 步骤一&#xff1a;出一个接口&#xff0c;接口内查询出10分钟内是否有异常信息 步骤二&#xff1a;XXLJob中设置预警的频率 步骤三&#xff1a;在重要的业务处输出指定格式日志即可 步骤一&#xff1a;出一个接口&#xff0c;接口内查询出10分钟内是否有异常信息 {&qu…

Java | Leetcode Java题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; class Solution {public String removeKdigits(String num, int k) {Deque<Character> deque new LinkedList<Character>();int length num.length();for (int i 0; i < length; i) {char digit num.charAt(i);while (!…

C语言字符函数和字符串函数(20)

文章目录 前言一、字符分类函数小练习 二、字符转换函数三、strlen的使用和模拟实现四、strcpy的使用和模拟实现五、strcat的使用和模拟实现六、strcmp的使用和模拟实现七、strncpy函数的使用八、strncat函数的使用九、strncmp函数的使用十、strstr函数的使用和模拟实现十一、s…

OpenGL3.3_C++_Windows(37)

调试&#xff1a; 视觉错误与CPU调试不同&#xff0c;在GLSL代码中也不能设置断点&#xff0c;出现错误的时候寻找错误的源头可能会非常困难。 glGetError&#xff08;&#xff09; GLenum glGetError();返回整形数字&#xff0c;查询错误标记&#xff0c;但是当一个错误标记…

C#开发基础之使用四种流行的数据库访问技术ADO.NET、Dapper、EF Core 和 SqlSugar 连接 SQL Server

前言 在这篇文章中&#xff0c;我们将介绍四种流行的数据库访问技术&#xff1a;ADO.NET、Dapper、Entity Framework Core (EF Core) 和 SqlSugar。每种技术都提供了与 SQL Server 进行交互的不同方法&#xff0c;我们将以 TestDB 数据库中的 User 表为例&#xff0c;展示如何…

关于malloc/free的一些知识点

序 关于malloc/free&#xff0c;我们都不陌生&#xff0c;在最开始学习c语言时就相当了解&#xff0c;包括c中的new也是封装的malloc。下边我以glibc实现的malloc来讲述一些关于malloc/free的知识点。 malloc/free malloc和free并不是系统调用&#xff0c;而是运行时库&…

C语言的结构体类型

在我们使用C语言进行编写代码时&#xff0c;常常会使用已经给定的类型来创建变量&#xff0c;比如int型&#xff0c;char型&#xff0c;double型等&#xff0c;而当我们想创建一些较为复杂的东西时&#xff0c;单单用一个类型变量是没办法做到的&#xff0c;比如我们想创建一个…

shader 案例学习笔记之fract函数

fract函数 可以理解为模1取余&#xff0c;获取一个数的小数部分&#xff0c;如果参数是向量&#xff0c;那就是获取每个向量分量上的小数 案例一 #ifdef GL_ES precision mediump float; #endif// 渲染分辨率 uniform vec2 u_resolution; // 程序运行时间 uniform float u_ti…

如何利用 Smarter Balanced 塑造教育领域的 AI 治理

目录 定义挑战 以人为本的设计引领 融入多样性 探索以学生为中心的价值观 探索效果的层次和不同的影响 部位于加利福尼亚州的Smarter Balanced Assessment Consortium 是一个由会员主导的公共组织&#xff0c;为 K-12 和高等教育领域的教育工作者提供评估系统。该组织成立…

初学者指南:MyBatis 入门教程

主要介绍了Mybatis的基本使用、JDBC、数据库连接池、lombok注解&#xff01; 文章目录 前言 什么是Mybatis? 快速入门 使用Mybatis查询所有的用户信息 配置SQL提示 JDBC介绍 Mybatis 数据库连接池 lombok 总结 前言 主要介绍了Mybatis的基本使用、JDBC、数据库连接…

基于stm32单片机使用 RT-Thread 系统的 ADC 外设

一、ADC 介绍 来源&#xff1a;RT-Thread 文档中心   ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号&#xff0c;例如温度、压力、声音或者图像等&#xff0c;需要转换成更容易储存、处理和发射…