接口测试和单元测试

news2024/11/24 18:30:14

  • 接口测试的本质:就是通过数据驱动,测试类里面的函数。
  • 单元测试的本质:通过代码级别,测试函数。
  • 单元测试的框架:unitest+接口,pytest+WEB----->接口,pytest+jenkins+allure。

requests 模块讲解和应用

基础知识

url:请求的地址 http://xxx:port

param:传递的参数 非必填参数 字典的格式传递参数

method:请求方式 支持get 以及post 字符串形式的参数

cookie:请求的时候传递的cookie值

利用requests模块写代码做接口测试。

利用request封装get请求和post请求,做接口测试。

以下文件都在request文件夹下。

#文件http_request_get.py
import requests
url='http://120.78.128.25:8765/Index/login.html'
res=requests.get(url)
print(res)
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("响应正文:",res.text)#html

复制

#文件http_request_post.py
import requests

url='http://httpbin.org/post'
data={"name":"qinghan","age":'18'}
res=requests.post(url,data)#消息实体
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("响应正文:",res.text,type(res.text))#html
print("响应正文2:",res.json(),type(res.json()))

复制

伪装请求头 User-Agent

#文件http_request_post_chongzhi.py
import requests
url='http://v.juhe.cn/laohuangli/d'
data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}
res=requests.post(url,data)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookie
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("**cookies**:",res.cookies)#从消息实体中拿到cookies
print("**cookies value**:",res.cookies['aliyungf_tc'])#类字典形式 Key取值
print("响应正文:",res.text,type(res.text))#html
print("响应正文2:",res.json(),type(res.json()))

recharge_url='http://v.juhe.cn/laohuangli/d'
recharge_data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}
header={'User-Agent':'Mozilla/5.0 '}#伪装充值的请求头
recharge_res=requests.get(recharge_url,recharge_data,headers=header,cookies=res.cookies)
print("充值结果:",recharge_res.json())
print("状态码:",recharge_res.status_code)
print("代理userAgent",recharge_res.request.headers)#获取请求头 request
#伪装请求头骗服务器!可以用来爬虫,如果别人有更高级的反爬虫那就不行了。哈哈

复制

消息实体中拿到cookie

#文件http_request_post_cookies.py
import requests
url='http://v.juhe.cn/laohuangli/d'
data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}
res=requests.post(url,data)#消息实体
print("响应头:",res.headers)
print("响应状态码:",res.status_code)
print("**cookies**:",res.cookies)#从消息实体中拿到cookies
print("**cookies value**:",res.cookies['aliyungf_tc'])#类字典形式 Key取值
print("响应正文:",res.text,type(res.text))#html
print("响应正文2:",res.json(),type(res.json()))
'''
响应头: {'Date': 'Sun, 02 Feb 2020 13:39:07 GMT', 'Content-Type': 'application/json;charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': 'aliyungf_tc=AQAAAC3SDE8KIAYAonD0eNi5kz0Qf9BA; Path=/; HttpOnly', 'Etag': '063d270dc44003f39cf480b7ec6ff843'}
响应状态码: 200
**cookies**: <RequestsCookieJar[<Cookie aliyungf_tc=AQAAAC3SDE8KIAYAonD0eNi5kz0Qf9BA for v.juhe.cn/>]>
**cookies value**: AQAAAC3SDE8KIAYAonD0eNi5kz0Qf9BA
响应正文: {"reason":"successed","result":{"id":"1666","yangli":"2014-09-09","yinli":"甲午(马)年八月十六","wuxing":"杨柳木 开执位","chongsha":"冲牛(丁丑)煞西","baiji":"癸不词讼理弱敌强 未不服药毒气入肠","jishen":"天恩 母仓 月德 不将 四相 阴德 金堂 时阳 生气 天仓","yi":"祭祀 立碑 修坟 启钻 除服 成服 馀事勿取","xiongshen":"五虚 土符 触水龙","ji":"馀事勿取"},"error_code":0} <class 'str'>
响应正文2: {'reason': 'successed', 'result': {'id': '1666', 'yangli': '2014-09-09', 'yinli': '甲午(马)年八月十六', 'wuxing': '杨柳
'''

复制

登录-充值

了解cookie是先登录的时候会产生,然后在这个网站充值的时候直接就有cookie了。

以下代码来自文件夹Tools。

#清菡没有找到登录和充值的接口,所以用的老黄历的接口模拟测试的。以下代码除了接口地址不对,代码可以用。
#来自文件http_request_1.py。

import requests
class Httprequest:
    '''利用requests封装get请求和post请求'''

    def http_request(self,url,data,method,cookie=None):
        '''url:请求的地址 http://xxx:port
               param:传递的参数  非必填参数  字典的格式传递参数
               method:请求方式支持get以及post  字符串形式的参数
               cookie:请求的时候传递的cookie值'''
        if method.lower()=='get':
            res = requests.get(url, data, cookies=cookie)
        else:
            res=requests.post(url,data,cookies=cookie)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookie
        return res#返回一个消息实体

if  __name__ =='__main__':
    url = 'http://v.juhe.cn/laohuangli/d'
    data = {"key": "abf91475fc19f66c2f1fe567edd75257", "date": '2014-09-09'}
    res=Httprequest().http_request(url,data,'post')
    print("登录结果是:", res.json())

#充值
    recharge_url='http://v.juhe.cn/laohuangli/d'
    recharge_data={"key":"abf91475fc19f66c2f1fe567edd75257","date":'2014-09-09'}
    recharges_res=Httprequest().http_request(recharge_url,recharge_data,'get',res.cookies)
    print("充值结果是:",recharges_res.json())

复制

有的登录有cookie,有的没有,看接口文档

#来自request_danyuanceshi.py文件
#这个项目是没有cookies的啊,你们测试找个有cookie的接口来测试,user_password我没写,可以自己找个接口来测。

import requests
class HttpRequest:
    '''利用request封装get请求和post请求'''

    def http_request(self,url,data,method,cookie=None):
        '''url:请求的地址 http://xxx:port
               param:传递的参数  非必填参数  字典的格式传递参数
               method:请求方式支持get以及post  字符串形式的参数
               cookie:请求的时候传递的cookie值'''
        if method.lower()=='get':
            res = requests.get(url, data, cookies=cookie)
        else:
            res=requests.post(url,data,cookies=cookie,verify=False)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookie
        return res#返回一个消息实体

if  __name__ =='__main__':
   url = 'http://a.buka.tv/buka/api/user/login.do'
   data={"user_phone_num":"18210033224","user_password":"保密","user_device":"b9a0c082-e133-f0d5-e7d1-aff61f8e2cf8"}
   res=HttpRequest().http_request(url,data,'post')
   print("布卡项目登录接口查询结果是:{0}".format(res.text))
   print("布卡项目登录接口cookies是:{0}".format(res.cookies))

   url_1 = 'http://a.buka.tv/buka/api/usercenterauth/userstate.do'
   data =  {"user_token":"1234","user_device":"b9a0c082-e133-f0d5-e7d1-aff61f8e2cf8"}
   res_2 =HttpRequest().http_request((url_1),data,'post',res.cookies)
   print("布卡项目搜索接口查询结果是:{0}".format(res_2.text))
   print("布卡项目搜索接口接口cookies是:{0}".format(res.cookies))

复制

python 单元测试-unittest

功能测试

1.写用例: TestCase

2.执行用例:

TestSuite 存储用例。

TestLoader 找用例,找到TestSuite的用例,加载出来。

3.对比实际结果、期望结果,判断用例是否通过,对比结果是否通过叫做断言。

断言:Assert

4.出具测试报告:TextTestRunner

unittest里面的TestCase专门来写用例

写一个测试类,对我们自己写的math method模块里面的类进行单元测试。以下文件都在unittest36文件夹下。首先,创建一个文件math_method.py。

class MathMethod:
    def __init__(self,a,b):
        self.a=a
        self.b=b

    def add(self):
        return self.a+self.b

    def multi(self):
        return self.a*self.b

复制

#来自文件case1.py

import unittest

from math_method import MathMethod

class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#编写测试用例
#一个用例就是一个函数,不能传参。只有self关键字
#所有的用例(所有的函数,都是test开头,test_)
   def test_add_two_positive(self):#两个正数相加 1+1
       res=MathMethod(1,1).add()#实际发起请求的结果值
       print("1+1的结果值是:",res)

   def test_add_two_zero(self):#两个0相加 0+0
       res=MathMethod(0,0).add()
       print("0+0的结果值是:",res)

   def test_add_two_negative(self):#两个负数相加 -1+-2
       res=MathMethod(-1,-2).add()
       print("0+0的结果是:",res)

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

复制

方法1:创建实例。可以只执行1条,也可以执行多条。

#来自文件TestSuite_fanfa1.py
import unittest
from unittest36.case1 import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器
#方法一:
#只执行一条  两个正数相加
#创建实例
suite.addTest(TestMathMethod('test_add_two_zero'))
#再创建一条实例
suite.addTest(TestMathMethod('test_add_two_positive'))
#执行
runner=unittest.TextTestRunner()
runner.run(suite)

复制

文件case1.py和TestSuite_fanfa1.py为1组,run文件TestSuite_fanfa1.py。

方法2:到测试类里面去找用例,根据这个测试类去加载到所有的用例。

loader是一个加载器, 它去帮你寻找用例,寻找完直接用addTest这个方法加到容器TestSuite里面去执行。

#来自文件TestSuite_fanfa2_1.py

import unittest
from unittest36.case1 import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器

#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))

#执行
runner=unittest.TextTestRunner()
runner.run(suite)

复制

文件case1.py和TestSuite_fanfa2_1.py为1组,run文件TTestSuite_fanfa2_1.py。

#来自文件case2
import unittest

from math_method import MathMethod

class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
   #编写测试用例
#一个用例就是一个函数,不能传参。只有self关键字
#所有的用例(所有的函数,都是test开头,test_)
   def test_add_two_positive(self):#两个正数相加 1+1
       res=MathMethod(1,1).add()#实际发起请求的结果值
       print("1+1的结果值是:",res)

   def test_add_two_zero(self):#两个0相加 0+0
       res=MathMethod(0,0).add()#
       print("0+0的结果值是:",res)

   def test_add_two_negative(self):#两个负数相加 -1+-2
       res=MathMethod(-1,-2).add()#
       print("0+0的结果是:",res)

class TestMulti(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#    #编写测试用例
# 一个用例就是一个函数,不能传参。只有self关键字
# 所有的用例(所有的函数,都是test开头,test_)
   def test_multi_two_positive(self):#两个正数相乘 1*1
       res=MathMethod(1,1).multi()#
       print("unittest36*1的结果值是:",res)

   def test_multi_two_zero(self):#两个0相乘 0*0
       res=MathMethod(0,0).multi()#
       print("0*0的结果值是:",res)

   def test_multi_two_negative(self):#两个负数相乘 -1*-2
       res=MathMethod(-1,-2).multi()#
       print("-unittest36*-2的结果值是:",res)


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

复制

方法3:从模块里去加载用例,加载该模块所有的用例。

#来自文件TestSuite_fanfa2_2.py

import unittest
from unittest36.case2 import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器

#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
from unittest36 import case1#具体到模块
#会到case2里面去找所有的用例,从模块里加载测试用例
suite.addTest(loader.loadTestsFromModule(case2))

#执行
runner=unittest.TextTestRunner()
runner.run(suite)

复制

文件case2.py和TestSuite_fanfa2_2.py为1组,run文件TestSuite_fanfa2_2.py。

常见的断言

需要掌握的断言

断言 assertEqual

#来自文件Assert.py

# 断言   assertEqual
import unittest
from unittest36.math_method import MathMethod#测试的目标类
class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
   def test_add_two_positive(self):#两个正数相加
       res=MathMethod(1,1).add()#实际发起请求的结果值
       print("1+1的结果值是:",res)
#加个断言:判断期望值与实际值的对比结果一致计算通过。不一致就算失败。
       self.assertEqual(2,res)#assertEqual()来自父类TestCase

   def test_add_two_zero(self):#两个0相加 0+0
       res=MathMethod(0,0).add()#
       print("0+0的结果值是:",res)
       self.assertEqual(1, res,"两个0相加出错了!")#断言里面msg是用例执行失败的时候才会显示

   def test_add_two_negative(self):#两个负数相加 -1+-2
       res=MathMethod(-1,-2).add()#
       print("-1+-2的结果值是:",res)
       self.assertEqual(-3,res)

   class TestMulti(unittest.TestCase):  # 继承了unittest里面的TestCase专门来写用例

       def test_multi_two_positive(self):  # 两个正数相乘 1*1
           res = MathMethod(1, 1).multi()  #
           print("1*1的结果值是:", res)

       def test_multi_two_zero(self):  # 两个0相乘 0*0
           res = MathMethod(0, 0).multi()  #
           print("0*0的结果值是:", res)

       def test_multi_two_negative(self):  # 两个负数相乘 -1*-2
           res = MathMethod(-1, -2).multi()  #
           print("-1*-2的结果值是:", res)

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

# Assert.py    TestSuite_fanfa2_2.py执行

复制

#来自文件TestSuite_fanfa2_2.py

import unittest
from unittest36.Assert import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器

#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
from unittest36 import Assert#具体到模块
#会到Assert里面去找所有的用例,从模块里加载测试用例
suite.addTest(loader.loadTestsFromModule(Assert))

#执行
runner=unittest.TextTestRunner()
runner.run(suite)

复制

文件Assert.py和TestSuite_fanfa2_2.py为1组,run文件TestSuite_fanfa2_2.py。

测试报告

#来自文件ceshibaogao_txt.py

import unittest
from unittest36.Assert  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器

#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))

#执行
file=open("test.txt",'w+',encoding='UTF-8')
runner=unittest.TextTestRunner(stream=file,verbosity=0)#verbosity=0,verbosity=1,verbosity=2 显示不一样,2最详细
runner.run(suite)

'''
根据ASCII编码按照字母排序的。
posive#2
zero#3
negative#1

执行结果:
-1+-2的结果值是: -3
1+1的结果值是: 2
0+0的结果值是: 0
'''

复制

文件Assert.py和文件ceshibaogao_txt.py为1组,run文件Tceshibaogao_txt.py。

必须加encoding='UTF-8',否则输出的txt显示乱码。

加了之后,正确显示。

上下文管理器

如果不关闭文件,会占用资源,影响性能。

#shangxiawenguanliqi.py

import unittest
from unittest36.Assert  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器

#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))

#执行  上下文管理器
with open("test.txt","w+",encoding="UTF-8")as file:#执行完代码,file会自动关闭掉。
    runner=unittest.TextTestRunner(stream=file, verbosity=2)#0 1 2   2是最详细的
    runner.run(suite)
print(file.closed)

复制

文件Assert.py和文件shangxiawenguanliqi.py为1组,run文件shangxiawenguanliqi.py。

异常处理

异常处理就是加raise e

#来自文件yichangchuli.py
#异常处理就是加raise e  # 异常处理完了之后,记得要抛出去
#如果不加raise e,用例就会全部通过
import unittest
from unittest36.math_method import MathMethod#测试的目标类
class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
   def test_add_two_positive(self):#两个正数相加 unittest36+unittest36
       res=MathMethod(1,1).add()#实际发起请求的结果值
       print("1+1的结果值是:",res)

       try:
           self.assertEqual(2,res)#assertEqual()来自父类
       except AssertionError as e:
           print("出错了,断言错误是{0}".format(e))
           raise e  # 异常处理完了之后,记得要抛出去

   def test_add_two_zero(self):#两个0相加 0+0
       res=MathMethod(0,0).add()#
       print("0+0的结果值是:",res)
       try:
            self.assertEqual(1, res,"两个0相加出错了!")#断言里面msg是用例执行失败的时候才会显示
       except AssertionError as e:
            print("出错了,断言错误是{0}".format(e))
            raise e  # 异常处理完了之后,记得要抛出去

   def test_add_two_negative(self):#两个负数相加 -1+-2
       res=MathMethod(-1,-2).add()#
       print("-1+-2的结果值是:", res)
       try:
           self.assertEqual(-3, res)
       except AssertionError as e:
           print("出错了,断言错误是{0}".format(e))
           raise e  # 异常处理完了之后,记得要抛出去

class TestMulti(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#    #编写测试用例
# #一个用例就是一个函数,不能传参。只有self关键字
# #所有的用例(所有的函数,都是test开头,test_)
   def test_multi_two_positive(self):#两个正数相乘 1*1
       res=MathMethod(1,1).multi()#
       print("unittest36*1的结果值是:",res)

   def test_multi_two_zero(self):#两个0相乘 0*0
       res=MathMethod(0,0).multi()#
       print("0*0的结果值是:",res)

   def test_multi_two_negative(self):#两个负数相乘 -1*-2
       res=MathMethod(-1,-2).multi()#
       print("-unittest36*-2的结果值是:",res)


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

复制

#来自文件test_report.py

import unittest
import HTMLTestRunner#别人写好的一个模块,你可以直接调用
from unittest36.set_upandtear_down  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器

#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))

#新鲜 html
with open("test_report.html",'wb') as file:
  runner=HTMLTestRunner.HTMLTestRunner(stream=file,
                                          verbosity=2,
                                          title="学python自动化 单元测试报告",
                                          description="第一次报告",tester='清菡'
                                          )

  runner.run(suite)

复制

文件yichangchuli.py和文件test_report.py为1组,run文件test_report.py。

setUp和tearDown

根据用例名进行识别,每条用例执行前都会执行setUp,每条用例执行完毕后都会执行tearDown,这就是夹心饼干。如果有操作必须在执行用例之前准备好,那就放在setUp里面(例如连接数据库,放在setUp里面),有操作必须在执行用例后要清除掉,那就放在tearDown里面(例如操作完毕,关闭操作数据库,放在tearDown里面)。

#来自文件set_upandtear_down.py
import unittest
from unittest36.math_method import MathMethod#测试的目标类
class TestMathMethod(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
   def setUp(self):
       print("我要开始执行用例了")

   def tearDown(self):
       print("我已经执行完用例了")

   def test_add_two_positive(self):#两个正数相加 unittest36+unittest36
       res=MathMethod(1,1).add()#实际发起请求的结果值
       print("1+1的结果值是:",res)
       try:
           self.assertEqual(2,res)#assertEqual()来自父类
       except AssertionError as e:
           print("出错了,断言错误是{0}".format(e))
           raise e  # 异常处理完了之后,记得要抛出去

   def test_add_two_zero(self):#两个0相加 0+0
       res=MathMethod(0,0).add()#
       print("0+0的结果值是:",res)
       try:
           self.assertEqual(1, res,"两个0相加出错了!")#断言里面msg是用例执行失败的时候才会显示
       except AssertionError as e:
           print("出错了,断言错误是{0}".format(e))
           raise e

   def test_add_two_negative(self):#两个负数相加 -1+-2
       res=MathMethod(-1,-2).add()#
       print("-1+-2的结果值是:", res)
       try:
           self.assertEqual(-3, res)
       except AssertionError as e:
           print("出错了,断言错误是{0}".format(e))
           raise e#异常处理完了之后,记得要抛出去

class TestMulti(unittest.TestCase):#继承了unittest里面的TestCase专门来写用例
#    #编写测试用例
# #一个用例就是一个函数,不能传参。只有self关键字
# #所有的用例(所有的函数,都是test开头,test_)
   def test_multi_two_positive(self):#两个正数相乘 1*1
       res=MathMethod(1,1).multi()#
       print("1*1的结果值是:",res)

   def test_multi_two_zero(self):#两个0相乘 0*0
       res=MathMethod(0,0).multi()#
       print("0*0的结果值是:",res)

   def test_multi_two_negative(self):#两个负数相乘 -1*-2
       res=MathMethod(-1,-2).multi()#
       print("-1-2的结果值是:",res)

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

复制

#来自文件test_report.py

import unittest
import HTMLTestRunner#别人写好的一个模块,你可以直接调用
from unittest36.set_upandtear_down  import TestMathMethod
suite=unittest.TestSuite()#存储用例的容器

#TestLoader 找用例,加载用例
loader=unittest.TestLoader()#创建一个加载器
#是到测试类里去找
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))

#新鲜 html
with open("test_report.html",'wb') as file:
  runner=HTMLTestRunner.HTMLTestRunner(stream=file,
                                          verbosity=2,
                                          title="学python自动化 单元测试报告",
                                          description="第一次报告",tester='清菡'
                                          )

  runner.run(suite)

复制

文件set_upandtear_down.py和test_report.py为1组,run文件test_report.py。

常识

1.开发写接口的时候定义好的get还是post请求,这些是写死的。

并不是所有的请求都支持get和post,有时候都支持,有时候只支持get,有时候只支持post,根据接口文档来看。

接口抓不到的原因:人家是get请求,你非要post去抓

2.为什么有些接口抓不到?

别的接口,包括接口地址,参数,未必都可以抓到,例如腾讯的,数据会加密或者是根本抓不到。

3.抓到接口了,哪个才是我想要的东西呢? 找关键字。 例如:/User/Api/login 这就是个登录的接口,有Api啊,Api就是关键字。

4.登录的时候有cookie是保存登录信息,例如账户用户名密码。

不是所有的东西都有cookie,这个是开发定义的,看软件的需求呢。第一次登录生成cookie,下次登录就会根据用户名,密码这些信息,对比校验是不是同一个人。这就是cookie。

例如考勤就没有cookie,因为考勤是每天都得打卡得,所以不需要cookie。

5.注意:鼠标放哪就执行哪条用例,如果鼠标放在全部用例的后面,点击run就会执行所有的用例。

 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

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

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

相关文章

机器学习实战9-基于多模型的自闭症的筛查与预测分析

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战9-基于多模型的自闭症的筛查与预测分析&#xff0c;自闭症是一种神经发育障碍&#xff0c;主要表现为人际交往和社交互动的困难、沟通障碍以及重复刻板行为。早期的筛查和分析对于儿童自闭症的诊断和干…

你知道Apache 软件基金会如何选择开源项目吗

Apache软件基金会&#xff08;Apache Software Foundation&#xff0c;简称ASF&#xff09;是一个致力于开源软件发展的慈善组织&#xff0c;因其广泛的项目和开放的治理模式而备受社区赞誉。作为全球最大的开源基金会之一&#xff0c;ASF如何选择开源项目成为人们关注的焦点。…

Spring方式发送邮箱

1.导入依赖 <!--邮件发送依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency> 2.导入工具类 package com.example.demo.demo;import org.springfram…

LED驱动(总线设备架构)——STM32MP157

文章目录 概述总线设备驱动总线设备驱动模型程序步骤&#xff1a;常用函数注册/ 反注册获得资源 LED 模板驱动程序的改造&#xff1a;总线设备驱动模型board_A_led.cchip_demo_gpio.cled_opr.hled_resource.hleddrv.cleddrv.hledtest.cMakefile编译测试 概述 为什么要引入总线设…

Maven 继承、聚合、属性

文章目录 一、继承1.1. 概念1.2. 语法1.3. 示例1.4. 其他常见使用 二、聚合2.1. 概念2.2. 示例 三、属性3.1. Java 系统属性3.2.系统环境变量属性3.3.Maven 内置属性 一、继承 1.1. 概念 当项目较大&#xff0c;为了便于开发和管理&#xff0c;经常需要将工程划分成多个 Maven…

【性能测试入门必看】性能测试流程简介

性能测试流程介绍&#xff1a; 一、性能测试流程&#xff08;一&#xff09;——问清性能测试需求 1、新系统能力验证 2、明确客户需求 3、找出系统性能瓶颈 4、稳定性验证&#xff08;强度测试&#xff09; 二、性能测试流程&#xff08;二&#xff09;——了解系统结构…

为什么C++支持函数重载

C语言中我们知道创建的函数是不能同名的&#xff0c;但是在C中却是可以的&#xff0c;这就是C中的函数重载&#xff0c;而函数重载有三种&#xff1a;函数参数类型不同、参数的数量不同、参数的顺序不同。所以就先浅浅的了解一下函数重载&#xff1a; 函数重载 参数类型不同 …

数据管道模型:场外流式数据市场形态探索

数据管道模型&#xff1a;场外流式数据市场形态探索 任洪润1,2, 朱扬勇1,2 1 复旦大学计算机科学技术学院&#xff0c;上海 200438 2上海市数据科学重点实验室&#xff0c;上海 200438 摘要&#xff1a;当前数据要素市场建设探索主要集中在数据交易场所&#xff08;场内&#x…

ubuntu18.04配置python虚拟环境

安装virtualenv 在机器上使用pip安装virtualenv pip install virtualenv创建虚拟环境 cd 到一个目录中创建虚拟环境 virtualenv 虚拟环境名 如 virtualenv venv 激活虚拟环境 在虚拟环境路径中执行source 加载activate source bin/activate结果如下&#xff1a;

【基于 GitLab 的 CI/CD 实践】02、gitlab-runner 实践

目录 一、gitlab-runner 简介 1.1 要求 1.2 特点 二、GitLab Runner 安装 2.1 使用 GItLab 官方仓库安装 2.2 使用 deb/rpm 软件包 2.3 在容器中运行 GitLab Runner 三、GitLab Runner 注册 3.1 GitLabRunner 类型 3.2 获取 runner token 获取 shared 类型 runner t…

Linux驱动之从点LED灯开始

目录 一、环境 二、Linux 下 LED 灯驱动原理 2.1 地址映射 2.2 I/O 内存访问函数 三、硬件原理图分析 四、实验程序编写 4.1驱动程序编写 4.2测试APP编写 五、编译驱动程序和测试 APP 5.1 编译驱动程序 5.2 编译测试 APP 六、测试 本期的内容到这就结束了&#xff…

Ubuntu下的rdate命令

介绍 用途&#xff1a;rdate命令的用途是从远程服务器上同步时间并设置到本地。 安装rdate 执行命令sudo apt install rdate进行安装&#xff1a; 查看rdate命令的帮助信息 执行命令man rdate&#xff0c;可以查看rdate的帮助信息&#xff1a; 示例 从远程服务器上同…

基于opencv对高空拍摄视频消抖处理

一、问题背景 无人机在拍摄视频时&#xff0c;由于风向等影响因素&#xff0c;不可避免会出现位移和旋转&#xff0c;导致拍摄出的画面存在平移和旋转的帧间变换&#xff0c; 即“抖动” 抖动会改变目标物体 (车辆、行人) 的坐标&#xff0c;给后续的检测、跟踪任务引入额外误差…

Html基础知识学习——圣杯布局、margin负值、等高布局(十七)

文章目录 圣杯布局margin负值等高布局 圣杯布局 两边页面固定中间页面宽度随着浏览器大小自适应 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

macOS - 安装 node、npm

文章目录 关于 node安装安装 node、npm 关于 node node.js 官网 : https://nodejs.org/engithub : https://github.com/nodejs Node.js is a free, open-sourced, cross-platform JavaScript run-time environment— that lets developers write command line tools and serv…

使用QTableWidget实现录像排程操作

一、介绍 该录像排程&#xff0c;是采用继承于QTableWidget的ScheduleTableWidget类进行实现。在ScheduleTableWidget实现类中&#xff0c;去除了Table原本的横向表头和纵向表头&#xff0c;分别采用第一行和第一列构成新的表头。新的横向表头代表一天24小时&#xff0c;新的纵…

CMake基础入门

文章目录 一、一个目录下有一个源文件&#xff08;入门&#xff09;1.1 预定义的变量1.2 语法介绍cmake_minimum_requiredprojectsetmessageadd_executable 1.3 最基础的实例1.4 第一步优化&#xff1a;build目录实操流程 1.5 第二步优化&#xff1a;src目录1.5.1 实操流程1.5.…

用心做好一款堡垒机,升级版《新一代堡垒机建设指南》白皮书现已开放下载!

编者注&#xff1a;本文刊登在《新一代堡垒机建设指南》&#xff08;JumpServer v3.0发布纪念版&#xff09;序言部分&#xff0c;文章作者为JumpServer开源堡垒机项目创始人广宏伟。点击文章底部“阅读原文”链接&#xff0c;即可下载新版《新一代堡垒机建设指南》白皮书。 “…

Vue3 – 实现过渡动画

1 认识Vue的动画原理 2 动画中常见类的作用 3 animation动画实现 4 动画的常见属性设置 5 列表元素动画组实现 6 列表元素的移动动画 认识Vue的动画原理 利用transition标签和一系列的动画类来控制标签的动画效果。 transition标签的本质是帮你添加和删除动画类的。 trans…

SpringBoot整合EasyExcel实现读操作

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot整合EasyExcel实现读操作 ⏱️ 创作时间&#xff1a; 2023年…