11.测试教程-自动化测试selenium-3

文章目录

  • 1.unittest框架解析
  • 2.批量执行脚本
    • 2.1构建测试套件
    • 2.2用例的执行顺序
    • 2.3忽略用例执行
  • 3.unittest断言
  • 4.HTML报告生成
  • 5.异常捕捉与错误截图
  • 6.数据驱动

大家好,我是晓星航。今天为大家带来的是 自动化测试selenium第三节 相关的讲解!😀

1.unittest框架解析

unittest 是python 的单元测试框架,它主要有以下作用:

**提供用例组织与执行:**当你的测试用例只有几条时,可以不必考虑用例的组织,但是,当测试用例达到 成百上千条时,大量的测试用例堆砌在一起,就产生了扩展性与维护性等问题,此时需要考虑用例的规 范与组织问题了。单元测试框架就是来解决这个问题的。

**提供丰富的比较方法:**在用例执行完之后都需要将实际结果与预期结果进行比较(断言),从而断定用 例是否可以顺利通过。单元测试一般会提供丰富的断言方法。例如,判断相等/不相等、包含/不包含、 True/False等断言方法。

**提供丰富的日志:**当测试用例执行失败时能抛出清晰的失败原因,当所有用例执行完成后能提供丰富的 执行结果。例如,总的执行时间,失败用例数,成功用例数等。

unittest里面有四个很重要的概念,test fixture,test case,test suite,test runner。

  • Test Fixture

    对一个测试用例环境的搭建和销毁,就是一个fixture,通过覆盖setUp()和tearDown()方法来实 现。
    setUp()方法可以进行测试环境的搭建,比如获取待测试浏览器的驱动,或者如果测试中需要访问 数据库,那么可以在setUp()中通过建立数据库连接来进行初始化。
    tearDown()方法进行环境的销毁,可以进行关闭浏览器,关闭数据库连接,清除数据库中产生的 数据等操作;

  • Test Case

    一个TestCase的实例就是一个测试用例。测试用例就是一个完整的测试流程,包括测试前准备环 境的搭建(setUp)、实现测试过程的代码,以及测试后环境的还原(tearDown)。单元测试 (unit test)的本质就在这里,一个测试用例就是一个完整的测试单元,可以对某一个功能进行验 证。

  • Test Suite

    一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起执行,这个就产生了测试 套件TestSuite的概念。Test Suit用来将多个测试用例组装在一起;

  • Test Runner

    测试的执行也是非常重要的一个概念,在unittest框架中,通过TextTestRunner类提供的run()方 法来执行test suite/test case。

下面为一个使用了unittest框架的脚本:

from selenium import webdriver
import unittest
import time
import os
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException
class Baidu1(unittest.TestCase):
def setUp(self):
print("-----setUp-----")
self.driver = webdriver.Chrome()
self.url = "https://www.baidu.com/"
self.driver.maximize_window()
time.sleep(3)
def tearDown(self):
print("-----tearDown-----")
self.driver.quit()
def test_hao(self):
driver = self.driver
url = self.url
driver.get(url)
driver.find_element_by_link_text("hao123").click()
time.sleep(6)
def test_hbaidu(self):
driver = self.driver
url = self.url
driver.get(url)
driver.find_element_by_id("kw").send_keys("突如其来的假期")
driver.find_element_by_id("su").submit()
time.sleep(5)
print(driver.title)
# self.assertNotEqual(driver.title, "百度一下_百度搜索", msg="不相等")
# self.assertTrue("beautiful"=="beauty", msg="Not Equal!")
time.sleep(6)
def saveScreenAsPhoto(self, driver, file_name):
if not os.path.exists("./image"):
os.makedirs("./image")
now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
time.sleep(3)
if __name__ == "__main__":
unittest.main()

这个脚本中的类 Baidu1 继承了unittest.TestCase类,所以它使用了unittest框架来组织测试用例 (TestCase)。

setUp() 和 setDown() 是unittest框架中的测试固件

以**test_**开头命名的方法,是测试方法,在运行整个类的时候会默认执行。

unittest提供了全局的main()方法,使用它可以方便地将一个单元测试模块变成可以直接运行的测试脚 本。main()方法搜索所有包含在该模块中以”test"命名的测试方法,并自动执行他们。

2.批量执行脚本

2.1构建测试套件

当我们增加了被测试功能和相应的测试用例之后,我们就需要把多个测试用例组织在一起执行,那 unittest框架是如何扩展和组织新增的测试用例的呢?它使用的就是上文中提到的测试套件Test Suite

假设我们已经编写了testbaidu1.py,testbaidu2.py两个文件,那么我们怎么同时执行这两个文件呢?

testbaidu1.py

from selenium import webdriver
import unittest
import time
import os
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException
class Baidu1(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.url = "https://www.baidu.com/"
self.driver.maximize_window()
time.sleep(3)
def tearDown(self):
self.driver.quit()
def test_hao(self):
driver = self.driver
url = self.url
driver.get(url)
driver.find_element_by_link_text("hao123").click()
time.sleep(6)
def test_hbaidu(self):
driver = self.driver
url = self.url
driver.get(url)
driver.find_element_by_id("kw").send_keys("突如其来的假期")
driver.find_element_by_id("su").submit()
time.sleep(5)
print(driver.title)
time.sleep(6)
def saveScreenAsPhoto(self, driver, file_name):
if not os.path.exists("./image"):
os.makedirs("./image")
now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
time.sleep(3)
if __name__ == "__main__":
unittest.main()

testbaidu2.py

# -*- coding: utf-8 -*-
from selenium import webdriver
import unittest
import time
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException
class Baidu2 (unittest.TestCase) :
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com/"
self.driver.maximize_window()
self.verificationErrors=[]
self.accept_next_alert = True
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
def test_hao(self):
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_link_text("新闻").click()
time.sleep(6)
self.assertTrue("123" == "1234", msg="not true")
time.sleep(3)
def test_baidusearch(self):
driver = self.driver
driver.get(self.base_url)
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(u"庆余年")
driver.find_element_by_id("su").click()
time.sleep(6)
def is_element_present(self, how, what):
try:
self.driver.find_element(by=how, value=what)
except NoSuchElementException as e:
return False
return True
def is_alert_present(self):
try:
self.driver.switch_to.alert
except NoAlertPresentException as e:
return False
return True
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to.alert
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
if __name__ == "__main__":
unittest.main(verbosity=2)

addTest()

TestSuite类的addTest()方法可以把不同的测试类中的测试方法组装到测试套件中,但是addTest()一次 只能把一个类里面的一个测试方法组装到测试套件中。方式如下:

将testbaidu1.py、testbaidu2.py中的测试方法放到一个测试套件中,在testsuite.py中实现。

testsuite.py

import unittest
from src0716 import testbaidu1
from src0716 import testbaidu2
def createsuite():
#addTest
suite = unittest.TestSuite()
suite.addTest(testbaidu1.Baidu1("test_hao"))
suite.addTest(testbaidu1.Baidu1("test_hbaidu"))
suite.addTest(testbaidu2.Baidu2("test_hao"))
suite.addTest(testbaidu2.Baidu2("test_baidusearch"))
return suite
if __name__=="__main__":
suite = createsuite()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

但是上述做法有两个不方便的地方,阻碍脚本的快速执行,必须每次修改testsuite.py:

1)需要导入所有的相关的py文件,比如 import testbaidu1,每新增一个脚本就需要导入一个

2)addTest一次只能增加一个测试方法,如果一个py文件中有10个测试方式,如果都要组装到测试套 件中,就需要增加10次

makeSuite()和TestLoader()的应用

在unittest 框架中提供了makeSuite() 的方法,makeSuite可以实现把测试用例类内所有的测试case组 成的测试套件TestSuite ,unittest 调用makeSuite的时候,只需要把测试类名称传入即可。

TestLoader 用于创建类和模块的测试套件,一般的情况下,使TestLoader().loadTestsFromTestCase(TestClass) 来加载测试类。

runall.py

# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
import testbaidu1
import testbaidu2
#手工添加案例到套件,
def createsuite():
suite = unittest.TestSuite()
#将测试用例加入到测试容器(套件)中
suite.addTest(unittest.makeSuite(testbaidu1.Baidu1))
suite.addTest(unittest.makeSuite(testbaidu2.Baidu2))
return suite
'''
suite1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
suite = unittest.TestSuite([suite1, suite2])
return suite
'''
if __name__=="__main__":
suite=createsuite()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

经过makeSuite()和TestLoader()的引入,我们不用一个py文件测试类,只需要导入一次即可。

那么能不能测试类也不用每次添加指定呢?

discover()的应用

discover 是通过递归的方式到其子目录中从指定的目录开始, 找到所有测试模块并返回一个包含它们 对象的TestSuite ,然后进行加载与模式匹配唯一的测试文件,discover 参数分别为 discover(dir,pattern,top_level_dir=None)

runall.py—注意路径

# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
#手工添加案例到套件,
def createsuite():
discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_le
vel_dir=None)
print discover
return discover
if __name__=="__main__":
suite=createsuite()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

2.2用例的执行顺序

unittest 框架默认加载测试用例的顺序是根据ASCII 码的顺序,数字与字母的顺序为: 09,AZ,a~z 。

所以, TestAdd 类会优先于TestBdd 类被发现, test_aaa() 方法会优先于test_ccc() 被执行。对于测试 目录与测试文件来说, unittest 框架同样是按照这个规则来加载测试用例。

addTest()方法按照增加顺序来执行。

2.3忽略用例执行

@unittest.skip(u'The function was canceled, neglects to perform thecase')
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
class Baidu1(unittest.TestCase):
#test fixture,初始化环境
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com/"
self.verificationErrors = []
self.accept_next_alert = True
@unittest.skip("skipping")
def test_baidusearch(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_id("kw").click()
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(u"测试")
driver.find_element_by_id("su").click()
driver.find_element_by_id("su").click()
def test_hao(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_link_text("hao123").click()
self.assertEqual(u"hao123_上网从这里开始", driver.title)
#判断element是否存在,可删除
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException as e: return False
return True
#判断alert是否存在,可删除
def is_alert_present(self):
try: self.driver.switch_to_alert()
except NoAlertPresentException as e: return False
return True
#关闭alert,可删除
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
#test fixture,清除环境
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
#执行用例
unittest.main()

3.unittest断言

自动化的测试中, 对于每个单独的case来说,一个case的执行结果中, 必然会有期望结果与实际结 果, 来判断该case是通过还是失败, 在unittest 的库中提供了大量的实用方法来检查预期值与实际 值, 来验证case的结果, 一般来说, 检查条件大体分为等价性, 逻辑比较以及其他, 如果给定的断 言通过, 测试会继续执行到下一行的代码, 如果断言失败, 对应的case测试会立即停止或者生成错误 信息( 一般打印错误信息即可) ,但是不要影响其他的case执行。

unittest 的单元测试库提供了标准的xUnit 断言方法。下面是一些常用的断言

image-20240125005939481

举例: self.assertEqual(“admin”, driver.find_element_by_link_text(“admin”).text)

4.HTML报告生成

脚本执行完毕之后,还需要看到HTML报告,下面我们就通过HTMLTestRunner.py 来生成测试报告。 HTMLTestRunner支持python2.7。python3可以参见http://blog.51cto.com/hzqldjb/1590802来进行 修改。

HTMLTestRunner.py 文件,下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html

下载后将其放在testcase目录中去或者放入…\Python27\Lib 目录下(windows)。

修改runall.py

# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
import HTMLTestRunner
#手工添加案例到套件,
def createsuite():
discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_le
vel_dir=None)
print discover
return discover
if __name__=="__main__":
curpath=sys.path[0]
#取当前时间
now=time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
if not os.path.exists(curpath+'/resultreport'):
os.makedirs(curpath+'/resultreport')
filename=curpath+'/resultreport/'+now+'resultreport.html'
with open(filename,'wb') as fp:
#出html报告
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'测试报
告',description=u'用例执行情况',verbosity=2)
suite=createsuite()
runner.run(suite)

5.异常捕捉与错误截图

用例不可能每一次运行都成功,肯定运行时候有不成功的时候。如果可以捕捉到错误,并且把错误截图 保存,这将是一个非常棒的功能,也会给我们错误定位带来方便。

例如编写一个函数,关键语句为driver.get_screenshot_as_file:

def savescreenshot(self,driver,file_name):
if not os.path.exists('./image'):
os.makedirs('./image')
now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))
#截图保存
driver.get_screenshot_as_file('./image/'+now+'-'+file_name)
time.sleep(1)

一个引用的例子:

testscreenshot.py

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
import os
class Baidu1(unittest.TestCase):
#test fixture,初始化环境
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com/"
self.verificationErrors = []
self.accept_next_alert = True
#测试用例,必须以test开头
def test_hao(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_link_text("hao123").click()
time.sleep(2)
try:
self.assertEqual(u'hao_上网从这里开始', driver.title)
except:
self.savescreenshot(driver,'hao.png')
#判断element是否存在,可删除
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException as e: return False
return True
#判断alert是否存在,可删除
def is_alert_present(self):
try: self.driver.switch_to_alert()
except NoAlertPresentException as e: return False
return True
#关闭alert,可删除
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
#test fixture,清除环境
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
def savescreenshot(self,driver,file_name):
if not os.path.exists('./image'):
os.makedirs('./image')
now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))
#截图保存
driver.get_screenshot_as_file('./image/'+now+'-'+file_name)
time.sleep(1)
if __name__ == "__main__":
#执行用例
unittest.main()
'''
可以增加verbosity参数,例如unittest.main(verbosity=2)
在主函数中,直接调用main() ,在main中加入verbosity=2 ,这样测试的结果就会显示的更加详细。
这里的verbosity 是一个选项, 表示测试结果的信息复杂度,有三个值:
0 ( 静默模式): 你只能获得总的测试用例数和总的结果比如总共100个失败,20 成功80
1 ( 默认模式): 非常类似静默模式只是在每个成功的用例前面有个“ . ” 每个失败的用例前面有个“F”
2 ( 详细模式): 测试结果会显示每个测试用例的所有相关的信息
'''

6.数据驱动

之前我们的case都是数据和代码在一起编写。考虑如下场景:

需要多次执行一个案例,比如baidu搜索,分别输入中文、英文、数字等进行搜索,这时候需要编写3个 案例吗?有没有版本一次运行?

python 的unittest 没有自带数据驱动功能。所以如果使用unittest,同时又想使用数据驱动,那么就可 以使用DDT来完成。

ddt的安装: http://ddt.readthedocs.io/en/latest/ https://github.com/txels/ddt

pip install ddt
python setup.py install

ddt使用方法:

参考文档:http://ddt.readthedocs.io/en/latest/

dd.ddt:

装饰类,也就是继承自TestCase的类。

ddt.data:

装饰测试方法。参数是一系列的值。

ddt.file_data:

装饰测试方法。参数是文件名。文件可以是json 或者 yaml类型。

注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件 处理。

如果文件中是列表,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。

如果文件中是字典,字典的key会作为测试用例方法的后缀显示,字典的值会作为测试用例参数。

ddt.unpack:

传递的是复杂的数据结构时使用。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列 表对应到多个参数上。字典也可以这样处理。

下面看一个样例:

test_data_list.json:

[
"Hello",
"Goodbye"
]

Testddt.py: 目录下建data文件夹,并建一个test_baidu_data.csv文件(用execl(最好用TXT文件)另 存为csv)

#-*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
import os,sys,csv
from ddt import ddt, data, unpack ,file_data
def getCsv(file_name):
rows=[]
path=sys.path[0].replace('\test','')
print path
with open(path+'/data/'+file_name,'rb') as f:
readers=csv.reader(f,delimiter=',',quotechar='|')
next(readers,None)
for row in readers:
temprows=[]
for i in row:
temprows.append(i.decode('gbk'))
rows.append(temprows)
return rows
#引入ddt
@ddt
class Testddt(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com"
self.verificationErrors = []
self.accept_next_alert = True
#测试用例,必须以test开头
#增加ddt数据
#@data('selenium',u'测试中文','9999999999')
#@data(2,3,4)
#单变更时不使用unpack
#@data([3, 2], [4, 3], [5, 3])
@data(*getCsv('test_baidu_data.csv'))
#使用file_data需要在cmd窗口下运行,否则找不到文件
#@file_data('test_data_list.json')
@unpack
def test_hao(self,value,expected_value):
#def test_hao(self,value):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(value)
driver.find_element_by_id("su").click()
time.sleep(2)
self.assertEqual(expected_value, driver.title)
print expected_value
print driver.title
#判断element是否存在,可删除
def is_element_present(self, how, what):
try: self.driver.find_element(by=how, value=what)
except NoSuchElementException as e: return False
return True
#判断alert是否存在,可删除
def is_alert_present(self):
try: self.driver.switch_to_alert()
except NoAlertPresentException as e: return False
return True
#关闭alert,可删除
def close_alert_and_get_its_text(self):
try:
alert = self.driver.switch_to_alert()
alert_text = alert.text
if self.accept_next_alert:
alert.accept()
else:
alert.dismiss()
return alert_text
finally: self.accept_next_alert = True
#test fixture,清除环境
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
def savescreenshot(self,driver,file_name):
if not os.path.exists('./image'):
os.makedirs('./image')
now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))
#截图保存
driver.get_screenshot_as_file('./image/'+now+'-'+file_name)
time.sleep(1)
if __name__ == "__main__":
#执行用例
unittest.main()
'''
可以增加verbosity参数,例如unittest.main(verbosity=2)
在主函数中,直接调用main() ,在main中加入verbosity=2 ,这样测试的结果就会显示的更加详细。
这里的verbosity 是一个选项, 表示测试结果的信息复杂度,有三个值:
0 ( 静默模式): 你只能获得总的测试用例数和总的结果比如总共100个失败,20 成功80
1 ( 默认模式): 非常类似静默模式只是在每个成功的用例前面有个“ . ” 每个失败的用例前面有个“F”
2 ( 详细模式): 测试结果会显示每个测试用例的所有相关的信息
'''

elf.driver.quit()
self.assertEqual([], self.verificationErrors)
def savescreenshot(self,driver,file_name):
if not os.path.exists(‘./image’):
os.makedirs(‘./image’)
now=time.strftime(“%Y%m%d-%H%M%S”,time.localtime(time.time()))
#截图保存
driver.get_screenshot_as_file(‘./image/’+now+‘-’+file_name)
time.sleep(1)
if name == “main”:
#执行用例
unittest.main()
‘’’
可以增加verbosity参数,例如unittest.main(verbosity=2)
在主函数中,直接调用main() ,在main中加入verbosity=2 ,这样测试的结果就会显示的更加详细。
这里的verbosity 是一个选项, 表示测试结果的信息复杂度,有三个值:
0 ( 静默模式): 你只能获得总的测试用例数和总的结果比如总共100个失败,20 成功80
1 ( 默认模式): 非常类似静默模式只是在每个成功的用例前面有个“ . ” 每个失败的用例前面有个“F”
2 ( 详细模式): 测试结果会显示每个测试用例的所有相关的信息
‘’’

*感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘*

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

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

相关文章

2024年大模型面试准备(三):聊一聊大模型的幻觉问题

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

羊大师羊奶靠谱么?信誉与持续见证,共筑信赖之选

羊大师羊奶靠谱么?信誉与持续见证,共筑信赖之选 在如今注重健康饮食的时代,羊奶以其丰富的营养价值和独特的风味,逐渐受到了消费者的青睐。在众多羊奶品牌中,羊大师羊奶以其出色的品质、良好的信誉和持续的创新精神&a…

关于「技术开发技能」课程

本课程分为三个部分,带您了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发,您将能了解各类服务的优势、功能、典型使用案例、技术概念和成本。 学习任选的两个课程模块,并通过测验者,将授予「技术开发技能…

隆道分享AI技术应用实践 以AI赋能采购业务管理

2024年3月21日-22日,以“面向务实的数字化”为主题的“第12届医药健康行业数字化高峰论坛”在上海举办。本届大会聚焦项目建设、技术创新与应用、新业务模式及收效等话题,探讨AI制药与大模型应用,分享智能化技术在多领域的落地案例。隆道公司…

情感视频素材从哪里找?推荐情感视频素材分享

随着时代变化短视频的兴起,人们越来越喜欢用视频来表达自己的情感和经历。为了满足创作者对于情感视频素材的需求,以下列出了几个素材分享网站,帮助你更好地创作和传达情感,引起大家的共鸣。 蛙学网 作为一家国内知名的素材分享…

python能做什么

python能做什么 Web开发:Python具有许多流行的Web框架,如Django和Flask,使得它成为Web开发的首选语言。它简洁、易于学习、且拥有丰富的生态系统,能够快速构建高性能的Web应用。 数据科学和机器学习:Python在数据科学…

Webpack部署本地服务器

Webpack部署本地服务器 目录 Webpack部署本地服务器目的认识模块热替换(HMR)什么是 HMRHMR 通过如下几种方式, 来提高开发的速度如何使用 HMRhost 配置 目的 完成自动编译 常用方式: webpack-dev-server webpack-dev-server 是一个用于开发环境的 Web 服…

动态规划,二维DP

文章目录 1、摆花2、异或选数3、数字三角形 1、摆花 分析: 输入2 4 3 2 的情况下,只有 (2,2) , (3,1) 这两种方案。 所以,设置状态 dp[i][j] 表示到第 i 种花(共 n 种花)、第 j 个位置(共 m 个位置&#xf…

Leetcode算法题笔记(2)

目录 图论51. 岛屿数量解法一 52. 腐烂的橘子解法一 53. 课程表解法一 54. 实现 Trie (前缀树)解法一 回溯55. 全排列解法一 56. 子集解法一解法二 57. 电话号码的字母组合解法一 58. 组合总和解法一解法二 59. 括号生成解法一解法二 60. 单词搜索解法一 61. 分割回文串解法一 …

[Netty实践] 请求响应同步实现

目录 一、介绍 二、依赖引入 三、公共部分实现 四、server端实现 五、client端实现 六、测试 一、介绍 本片文章将实现请求响应同步,什么是请求响应同步呢?就是当我们发起一个请求时,希望能够在一定时间内同步(线程阻塞&am…

FPGA高端项目:解码索尼IMX327 MIPI相机转HDMI输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 6、工程源码…

Java中SPI机制简单演示

Java中SPI机制简单演示 写一个SpiService接口 public interface SpiService {void run();}写两个实现类,注意:实现类可以跨包 Slf4j public class SpiServiceImpl1 implements SpiService {Overridepublic void run() {log.warn("SpiServiceImpl…

简单破除github的2FA验证

简单破除github的2FA验证 文章目录 简单破除github的2FA验证👨‍🏫Authenticator工具 👨‍🏫Authenticator工具 最近使用github的时候发现要搞一个2FA的验证才可以 验证的途径有两种:一种是用手机电话验证,…

使用easyYapi生成文档

easyYapi生成文档 背景1.安装配置1.1 介绍1.2 安装1.3 配置1.3.1 Export Postman1.3.2 Export Yapi1.3.3 Export Markdown1.3.4 Export Api1.3.6 常见问题补充 2. java注释规范2.1 接口注释规范2.2 出入参注释规范 3. 特定化支持3.1 必填校验3.2 忽略导出3.3 返回不一致3.4 设置…

第二证券|高速连接概念再度活跃,沃尔核材5日涨近60%,胜蓝股份等走高

高速连接概念26日盘中再度走强,到发稿,胜蓝股份涨超13%,沃尔核材涨停,华丰科技、奥飞数据涨超5%。 值得注意的是,沃尔核材近5个交易日已收成4个涨停板,累计大涨近60%。公司近来在投资者互动平台表示&#…

宽光谱SOA光芯片设计(一)

-本文翻译自由Geoff H. Darling于2003年撰写的文章。尽管文章较早,但可以了解一些SOA底层原理,并可看到早期SOA研究的思路和过程,于今仍有很高借鉴价值。 摘要 本文介绍一种新型宽光谱半导体光放大器(SOA)技术&#x…

【数据分享】中国土壤有机质数据集(免费获取)

中国土壤有机质数据集对于农业、生态环境保护等领域具有重要意义。通过对土壤有机质等多项指标的统计和分析,可以更好地了解土壤的特性,指导合理的土壤管理和保护措施的制定,从而促进农业生产的可持续发展,并为生态环境保护提供科…

数据结构与算法之美学习笔记:《数据结构与算法之美》学习指导手册

目录 前言 前言 本节课程思维导图: 在设计专栏内容的时候,为了兼顾不同基础的同学,我在内容上做到了难易结合,既有简单的数组、链表、栈、队列这些基础内容,也有红黑树、BM、KMP 这些难度较大的算法。但是,…

利用云手机高效运营多个海外社媒账户

随着全球化进程的不断推进,中国出海企业和B2B外贸企业日益重视海外社媒营销,将其视为抢占市场份额的关键策略。在海外社媒营销中,企业通常会在多个平台上批量开通账户,搭建自己的社媒内容矩阵。本文将会介绍如何用云手机高效运营多…

格雷希尔G25F系列快速接头,在新能源电池包气密性测试时的各种电气接插件的应用

一些大的新能源电池制造商如:比亚迪、宁德时代、国轩高科、亿纬锂能、东方时代等,在全球的新能源电池市场上占据着重要的地位。新能源PACK电池包在生产时,需要经过一些严苛的测试,用以检测产品的品质是否达到合格标准,…