如何在不同的浏览器中设置Selenium网格以并行执行

到目前为止,Selenium是最常用的Web自动化测试工具。 如此受欢迎的原因之一是Selenium的自动跨浏览器测试功能。 硒自动化测试可以帮助您在所有主要浏览器,所有主要操作系统甚至移动设备浏览器上进行测试。 您可以在所有功能测试中获得广泛的浏览器覆盖,从而确保为广大潜在用户提供完美的体验。

但是,这是一个挑战。 您只能在本地计算机上加载这么多不同的浏览器。 例如,如果您有一台Windows计算机,则无法在Safari浏览器上进行测试,同样,如果您有一台Mac计算机,则将无法在IE或Edge浏览器上进行测试。 此外,在一台机器上运行测试是一个耗时的过程。 如果您有多台计算机,为什么要一次测试一台呢?

理想的方案是在具有不同浏览器环境的互连机器网络上进行测试,该浏览器环境同时并行运行多个测试用例,并将总测试时间减少数倍。 在这里,我还包括跨浏览器测试所花费的时间。

这正是Selenium Grid的基础。 与Selenium WebDriver允许您以顺序方式执行自动跨浏览器测试不同 ,Selenium Grid设置将允许您同时在不同的浏览器/浏览器版本中运行测试用例。

什么是硒网格?

在开始Selenium Grid设置之前,有必要了解Selenium Grid的基础知识。

因此,Selenium Grid基本上允许我们针对不同的浏览器在不同的操作系统上运行自动化测试。 而且这也是并行的。 Selenium自动化测试工具将帮助您更快地进行跨浏览器自动化测试,并有效利用内部硬件。

Selenium Grid由两个概念组成:

  • 集线器:它是Selenium Grid设置体系结构的中心,用于管理测试机器的网络。 网络中只有一个集线器被分配给DesiredCapabilities测试(操作系统,浏览器,浏览器版本),然后集线器会找到与给定配置匹配的测试。
  • 节点:节点是执行先前在集线器上加载的测试的测试计算机。 可以有多个节点配置了不同的操作系统和不同的浏览器。 节点在运行集线器的同一平台上运行不是强制性的。

配置Selenium Grid设置以并行执行的基础结构仅涉及两个步骤:

  1. 创建中心。
  2. 定义节点并连接到该集线器。

使用命令提示符进行Selenium Grid设置

Selenium Grid设置的第一步是创建一个集线器。 您必须确保系统安装了Java Runtime Environment(JRE)或更好的Java Development Kit(JDK)。 尽管大多数人建议使用最新的JDK,但我更喜欢早先经过测试和测试的版本,例如JDK SE 08或09。如果愿意,可以选择最新的版本。 以下是后续步骤–

  • 下载并解压缩Selenium Standalone服务器JAR文件。 您可以从此处下载它们。
  • 接下来,打开命令提示符或终端,然后导航到保存Selenium Standalone Server jar文件的目录。
  • 运行命令“ java -jar selenium-server-standalone-3.141.59.jar -role hub”。 默认情况下,此命令将在端口4444上启动Selenium Grid集线器。 您还可以通过定向到http:// localhost:4444 / grid / console来进行检查 。

由于已经创建了集线器,因此为并行执行而设置Selenium Grid的下一步将涉及启动节点。 首先,转到要在其中设置节点的其他计算机。 同样,这些机器应具有JDK / JRE设置。

在节点机器上,打开命令提示符或终端,然后导航到保存浏览器驱动程序文件的目录。

输入以下命令,以便在Selenium Grid设置中配置Chrome驱动程序以并行执行 。

 “java -Dwebdriver.chrome.driver= "C:\chromedriver.exe" -jar  selenium-server-standalone- 3.141 . 59 .jar -role webdriver -hub  http: //10.0.0.22:4444/grid/register -port 4546” 
  • 在上面的命令中,我已将计算机IP以及集线器实际运行的端口4444一起使用。 我还选择了要我的节点注册的端口4546。 您可以选择任何空闲端口来注册节点。

同样,您可以为其他浏览器注册其他节点。 例如,这是将Firefox(Gecko)驱动程序和Internet Explorer驱动程序配置到Selenium Grid设置以并行执行的方法。

在Selenium Grid设置中配置Firefox(Gecko)驱动程序:

 “java -Dwebdriver.gecko.driver= "C:\geckodriver.exe" -jar  selenium-server-standalone- 3.141 . 59 .jar -role webdriver -hub  http: //10.0.0.22:4444/grid/register -port 5566” 

在Selenium Grid设置中配置IE(Internet Explorer)驱动程序:

 “java -Dwebdriver.ie.driver= "C:\IEDriverServer.exe" -jar  selenium-server-standalone- 3.141 . 59 .jar -role webdriver -hub  http: //10.0.0.22:4444/grid/register -port 4547” 

注意:请确保为不同的节点选择不同的端口以与在端口4444上运行的单个集线器连接。此外,在IE上运行测试之前,请确保浏览器缩放正好是100%,否则可能显示错误。

您可以通过上面的命令注意到,我们正在端口4546上运行chrome驱动程序的第一个节点,firefox驱动程序的第二个节点在端口5566上运行,而IE浏览器的第三个节点在端口4547上运行。这是输出屏幕截图供进一步参考:

现在,我们已经配置了Selenium Grid设置,下一步就是为您的跨浏览器测试套件执行Selenium自动化测试。

使用Selenium Grid执行自动化测试以并行执行

现在该进行一些自动化的跨浏览器测试了! 我将运行一个自动化脚本,演示Selenium Grid的并行执行。 该脚本可以在Chrome,Firefox和Internet Explorer上并行运行,这些浏览器在不同的端口上注册并附加到单个集线器。

这是我使用Selenium Grid执行自动化测试以在不同浏览器中并行执行的示例代码。

 package DemoAutomation;   import java.net.MalformedURLException;  import java.net.URL;  import java.util.concurrent.TimeUnit;   import org.openqa.selenium.By;  import org.openqa.selenium.Platform;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.ie.InternetExplorerDriver;  import org.openqa.selenium.remote.CapabilityType;  import org.openqa.selenium.remote.DesiredCapabilities;  import org.openqa.selenium.remote.RemoteWebDriver;  import org.testng.annotations.AfterMethod;  import org.testng.annotations.BeforeMethod;  import org.testng.annotations.DataProvider;  import org.testng.annotations.Parameters;  import org.testng.annotations.Test;    public class Selenium_MultiBrowser_Test  { WebDriver driver; String nodeURL;     @Parameters ({ "Port" }) @BeforeMethod () public void setUp(String Port) throws MalformedURLException { if (Port.equalsIgnoreCase( "4546" )) { nodeURL = " http://10.0.0.22:4546/wd/hub " ; System.out.println( "Chrome Browser Initiated" ); DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setBrowserName( "chrome" ); capabilities.setPlatform(Platform.WINDOWS);             driver = new RemoteWebDriver( new URL(nodeURL),capabilities);             driver.get( " https://www.apple.com/ " ); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); }         else if (Port.equalsIgnoreCase( "5566" )) { nodeURL = " http://10.0.0.22:5566/wd/hub " ; System.out.println( "Firefox Browser Initiated" ); DesiredCapabilities capabilities1 = DesiredCapabilities.firefox(); capabilities1.setBrowserName( "firefox" ); capabilities1.setPlatform(Platform.WINDOWS);                 driver = new RemoteWebDriver( new URL(nodeURL),capabilities1);                 driver.get( " https://www.apple.com/ " ); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); }         else             if (Port.equalsIgnoreCase( "4547" )) { nodeURL = " http://10.0.0.22:4547/wd/hub " ; System.out.println( "Internet Browser Initiated" ); DesiredCapabilities capabilities2 = DesiredCapabilities.internetExplorer(); capabilities2.setBrowserName( "internet explorer" ); capabilities2.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true ); capabilities2.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true ); capabilities2.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true ); "ignoreProtectedModeSettings" capabilities2.setCapability( "ignoreProtectedModeSettings" , true ); "nativeEvents" capabilities2.setCapability( "nativeEvents" , false ); capabilities2.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL, "" ); capabilities2.setCapability(InternetExplorerDriver.LOG_LEVEL, "DEBUG" );                          capabilities2.setPlatform(Platform.WINDOWS);             driver = new RemoteWebDriver( new URL(nodeURL),capabilities2);             driver.get( " https://www.apple.com/ " ); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); } }     @Test public void appleSite() throws InterruptedException { try {         driver.findElement(By.xpath( "//*[@id=\'ac-globalnav\']/div/ul[2]/li[3]" )).click(); Thread.sleep( 2000 );  driver.findElement(By.cssSelector( "#chapternav > div > ul > li.chapternav-item.chapternav-item-ipad-air > a > figure" )).click(); Thread.sleep( 2000 );  driver.findElement(By.linkText( "Why iPad" )).click(); Thread.sleep( 2000 ); }         catch (Exception e) { System.out.println(e.getMessage()); } }      @AfterMethod () public void tearDown() { driver.quit(); System.out.println( "Browser Closed" ); }  } 

上面是用XML文件配置的Java类文件,该XML文件包括在Java文件中传递的参数值,并且还有助于创建一组可以并行运行的不同类。

 <?xml version= "1.0" encoding= "UTF-8" ?>  <!DOCTYPE suite SYSTEM " http://testng.org/testng-1.0.dtd " >  <suite thread-count= "3" name= "BlogSuite" parallel= "tests" >   <test name= "Chrome Test" >  <parameter name= "Port" value= "4546" /> <classes> < class name= "DemoAutomation.Selenium_MultiBrowser_Test" />       </classes> </test>   <test name= "Firefox Test" >  <parameter name= "Port" value= "5566" /> <classes> < class name= "DemoAutomation.Selenium_MultiBrowser_Test" />       </classes> </test>     <test name= "Internet Explorer Test" >  <parameter name= "Port" value= "4547" /> <classes> < class name= "DemoAutomation.Selenium_MultiBrowser_Test" />       </classes> </test>     </suite> 

输出画面:

在上面的代码中,我使用了DesiredCapabilities类,该类将帮助您设置Selenium WebDriver的属性。 这些属性可用于配置要在其上运行脚本的浏览器实例,例如Br​​owserName和BrowserVersion。

注意:但是,该脚本只能在测试计算机上当前安装的浏览器和浏览器版本上运行。 假设,如果您尝试在Chrome 72上运行测试,而测试计算机上仅安装了Chrome 74,那么脚本将显示错误。 当您选择与测试计算机的操作系统相比不同的操作系统时,会发生相同的情况。

此外,每次启动新的操作系统时,在新的Mac和Windows环境中进行投资都是相当昂贵的。

因此,如果您希望在不同的浏览器,浏览器版本和操作系统上执行自动跨浏览器测试,那么我建议您寻找一种可在云上提供Selenium Grid设置的工具,例如LambdaTest。

在LambdaTest Selenium Grid Cloud上运行自动化测试

让我们尝试在LambdaTest Selenium Grid上运行相同的测试用例。 您可以使用LambdaTest 所需功能生成器来配置所需功能对象。 手动完成后,这将节省您在Selenium Grid设置中花费的大量时间。

使用LambdaTest,您只需要创建一个远程服务器,在脚本中添加LambdaTest用户名,访问密钥和Grid URL,就可以了。

下面是TestNG框架中的Java代码,在这种情况下会更有利:

 package lambdatest;  import java.net.MalformedURLException;  import java.net.URL;   import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.remote.DesiredCapabilities;  import org.openqa.selenium.remote.RemoteWebDriver;  import org.testng.annotations.AfterTest;  import org.testng.annotations.BeforeTest;  import org.testng.annotations.Test;    public class SampleTest { public String username = "enteryourusernamehere" ; public String accesskey = "enteryourkeyhere" ; public RemoteWebDriver driver = null ; public String gridURL = "@hub.lambdatest.com/wd/hub" ; boolean status = false ;  @BeforeTest @org .testng.annotations.Parameters(value={ "browser" , "version" , "platform" }) public void setUp(String browser, String version, String platform) throws Exception { DesiredCapabilities capabilities = new DesiredCapabilities(); "browserName" capabilities.setCapability( "browserName" , browser); capabilities.setCapability( "version" , version); capabilities.setCapability( "platform" , platform); // If this cap isn't specified, it will just get the any available one capabilities.setCapability( "build" , "Selenium Grid" ); capabilities.setCapability( "name" , "Sample Test" ); capabilities.setCapability( "network" , true ); // To enable network logs capabilities.setCapability( "visual" , true ); // To enable step by step screenshot capabilities.setCapability( "video" , true ); // To enable video recording capabilities.setCapability( "console" , true ); // To capture console logs try { driver = new RemoteWebDriver( new URL( " https:// " + username + ":" + accesskey + gridURL), capabilities); } catch (MalformedURLException e) { System.out.println( "Invalid grid URL" ); } catch (Exception e) { System.out.println(e.getMessage()); } }  @Test public void testSimple() throws Exception { try {             driver.get( " https://www.apple.com/ " ); driver.manage().window().maximize();             driver.findElement(By.xpath( "//*[@id=\'ac-globalnav\']/div/ul[2]/li[3]" )).click(); Thread.sleep( 2000 );  driver.findElement( By.cssSelector( "#chapternav > div > ul > li.chapternav-item.chapternav-item-ipad-air > a" )).click(); Thread.sleep( 2000 );  driver.findElement(By.linkText( "Why iPad" )).click(); Thread.sleep( 2000 );           } catch (Exception e) { System.out.println(e.getMessage()); } }    @AfterTest public void tearDown() throws Exception { if (driver != null ) { ((JavascriptExecutor) driver).executeScript( "lambda-status=" + status); driver.quit(); } }  } 

现在,我们将使用包含Java文件中传递的参数值的XML文件运行此Java类文件,还有助于创建一组不同的类,使用这些类,我们可以使用Selenium Grid进行自动化测试以在以下位置并行执行不同的配置。

 <?xml version= "1.0" encoding= "UTF-8" ?>  <!DOCTYPE suite SYSTEM " http://testng.org/testng-1.0.dtd " >  <suite thread-count= "3" name= "BlogSuite" parallel= "tests" >  <test name= "FirefoxTest" > <parameter name= "browser" value= "firefox" /> <parameter name= "version" value= "62.0" /> <parameter name= "platform" value= "WIN8" /> <classes> < class name= "lambdatest.SampleTest" /> </classes> </test>  <test name= "ChromeTest" > <parameter name= "browser" value= "chrome" /> <parameter name= "version" value= "70.0" /> <parameter name= "platform" value= "WIN10" /> <classes> < class name= "lambdatest.SampleTest" /> </classes> </test>  <test name= "SafariTest" > <parameter name= "browser" value= "safari" /> <parameter name= "version" value= "11.0" /> <parameter name= "platform" value= "macos High Sierra" /> <classes> < class name= "lambdatest.SampleTest" /> </classes> </test>   </suite> 

输出画面:

现在,我们已经成功地使用Selenium Grid执行了自动化测试,可以在不同的浏览器以及不同的操作系统上并行执行,而无需创建集线器并在不同端口上启动节点。 当测试在Selenium Grid上运行时,您可以看到测试的实时视频流以及各种其他详细信息,例如命令,其中包括脚本传递的每个命令的屏幕截图,以及引发的日志和异常。

您还可以创建自己的团队,并以团队形式运行自动跨浏览器兼容性测试脚本。 这些测试结果对于团队中添加的每个成员都是可见的。 此外,通过我们的单击集成,您的队友可以将在跨浏览器测试期间发现的所有错误直接记录到Jira,Trello,Asana,Mantis,GitHub等各种项目管理平台上。此外,LambdaTest还与CI / CD集成与您的自动化测试工具(例如CircleCI,Jenkins,TravisCI等)互补的平台。请查看所有LambdaTest集成 。

结论

如果手动完成,Selenium Grid设置可能会很困难。 如果Selenium Grid的主要目的是并行运行测试并在不同的配置上进行测试,则可以在LambdaTest上执行相同的测试,而无需花费时间和资源来创建Selenium Grid Hub和Selenium Grid节点。 因此,请通过在此在线Grid上运行自动化测试来尝试一下,并在注释框中告知我们有关使用LambdaTest的反馈的信息。 测试愉快!

在LambdaTest担任自动化专家,最近开始了专业之旅。 Java测试自动化中的Excel。

翻译自: https://www.javacodegeeks.com/2019/07/setup-selenium-grid-parallel-execution-different-browsers.html

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

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

相关文章

网管型工业交换机和 非网管型工业交换机的优缺点

工业交换机专业为达到灵便变化多端的工业生产运用要求而设计方案&#xff0c;出示一种性价比高电力线通信通讯解决方法。而工业交换机也分成网管型和非网管型二种。那么&#xff0c;网管型工业交换机和非网管型工业交换机有什么不同&#xff0c;大家该如何选择呢&#xff1f;接…

如何集成和使用EclEmma插件来获得良好的Junit覆盖率

你好朋友&#xff0c; 如果编写好的代码很重要&#xff0c;那么编写覆盖所有业务逻辑的优良Junit测试用例也同样重要。通过编写覆盖业务逻辑的Junit测试用例&#xff0c;我们实际上确保代码的每种方法都能正常工作按照预期进行&#xff0c;因此减少了在软件开发的后期阶段中获…

工业4.0时代,工业交换机在智能电网建设中有什么作用?

随着工业以太网技术、光纤技术和信息处理技术的发展&#xff0c;并向电力行业的渗透&#xff0c;在当前技术条件支持下&#xff0c;工业以太网通信在运行过程中表现出高可靠性、灵活性和扩展性等优点&#xff0c;对优化整个电网系统设备元件之间的连接和信息传输有着重要的作用…

工业交换机的性能优势有哪些?

工业交换机也称作工业以太网交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;对工业交换机我们有多少人了解呢&#xff1f;究竟何为工业交换机&#xff0c;工业交换机有哪些功能呢&#xff1f;接下来就由飞畅科技的小编来为大家详细讲解下吧&#xff01;…

谷歌浏览器出现“远程计算机访问失败问题”

转载链接 一、进入浏览器设置 二、“internet选项”目录 三、设置 只勾选一个&#xff0c;其余均不选。 四、打开新网页&#xff0c;解决问题

工业交换机都有哪些优势,该如何挑选

相对普通交换机而言&#xff0c;工业交换机在普通交换机的基础之上加强了功能&#xff0c;端口配置和产品系列更加丰富和灵活&#xff0c;能够满足各种工业领域的需求。广泛应用于智慧交通、安防监控、风电光伏、煤矿等领域。尤其是电力、交通、冶金被称为工业交换机应用的三大…

用Java中的抽象类扩展抽象类

示例问题 当我创建Java :: Geci抽象类AbstractFieldsGenerator和AbstractFilteredFieldsGenerator我遇到了一个不太复杂的设计问题。 我想强调一下&#xff0c;对于某些人来说&#xff0c;这个问题和设计可能看起来很明显&#xff0c;但是在我最近与一位初级开发人员&#xff0…

工业交换机与工业路由器的区别

工业交换机&#xff08;也叫工业以太网交换机&#xff09;&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;由于采用的网络标准&#xff0c;其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议&#xff0c;以太网已经成为工业控制领域的主要通…

Sublime介绍安装和使用(转载)

转载&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/ITTechnologyHome/article/details/80486235 1.1 Sublime介绍 Sublime是一款跨平台、收费的文件编辑器&#xff0c;可以用来编写HTML,CSS,JavaScript,PHP等应用程序。 1.2 Sublime特点 跨平台,支持主流操作系统…

工业交换机在城市智慧轨道交通中的应用分析

俗话说&#xff0c;城市建设&#xff0c;交通先行&#xff0c;轨道交通是解决“城市病”的一把金钥匙&#xff0c;而智慧交通更是建设智慧城市的重要构成部分。从2009年开始&#xff0c;我国就逐渐进入城市轨道交通建设的高潮&#xff0c;并逐年扩大地铁市场。发展以轨道交通为…

apache hive_Hive:使用Apache Hive查询客户最喜欢的搜索查询和产品视图计数

apache hive这篇文章介绍了如何使用Apache Hive查询Hadoop下存储的搜索点击数据。 我们将以示例的形式生成有关总产品浏览量的客户最爱搜索查询和统计信息。 继续之前的文章 使用大数据分析客户产品搜索点击次数 &#xff0c; Flume&#xff1a;使用Apache Flume收集客户产品…

工业交换机在工业通信领域的应用分析

工业交换机是专门为满足灵活多变的工业应用需求而设计&#xff0c;提供一种高性价比工业以太网通讯解决方案。工业交换机&#xff0c;作为我们广为使用的局域网硬件设备&#xff0c;一直为大家所熟悉。它的普及程度其实是由于以太网的广泛使用&#xff0c;作为今天以太网的主流…

工业以太网交换机都有哪些作用

工业以太网交换机由于使用及定位的关系&#xff0c;区别于商业交换机&#xff0c;它更关注稳定性&#xff0c;耐高温&#xff0c;耐振动&#xff0c;耐腐蚀等一些工业特性。工业以太网交换机以其较高的防护等级&#xff08;一般IP40)、较强的电磁兼容性&#xff08;EMS 4级&…

光纤交换机是什么,光纤交换机的作用是什么?

随着网络的发展&#xff0c;先后出现了交换机、路由器、电话光端机等网络设备&#xff0c;在数据存储网络中&#xff0c;光纤交换机起到了重要的作用。今天飞畅科技的小编来为大家介绍下光纤交换机及光纤交换机的作用&#xff0c;一起来看看吧&#xff01; 光纤交换机的简介 光…

光纤交换机产品功能介绍

光纤交换机是一种高速的网络传输中继设备&#xff0c;又叫做光纤通道交换机、SAN交换机&#xff0c;光纤传输的优点是速度快、抗干扰能力强。那么&#xff0c;光纤交换机有哪些功能呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来看看吧&#xff01; 通道协议支持 SAN交换…

光纤交换机光纤通道协议介绍

光纤通道&#xff08;FC&#xff0c;Fibre Channel&#xff09;协议是美国国家标准所指定的一种串行高速、低延时、低误码的标准协议能够为存储设备、IP 数据网、音频流等应用提供高速数据传输的骨干网络技术。随着光纤通道在不同领域的应用&#xff0c;在光纤通道协议的基础上…

POI创建的文档具有不同条件的灵活样式

介绍 这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下&#xff0c;Java程序员使用POI :-)。 这些报告通常具有严格的样式和数据格式规则。 数据通常是SQL查询执行的结果…

在NS-3中安装可视化工具pyviz的一些问题的解决

转载声明&#xff1a;本文为寻同学原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文链接&#xff1a;https://blog.csdn.net/qq_31676673/article/details/88107454 在NS-3中安装可视化工具pyviz的一些问题的解决 PyViz是一…

什么是光纤交换机?

光纤交换机是一种高速的网络传输中继设备&#xff0c;又叫做光纤通道交换机、SAN交换机&#xff0c;它较普通交换机而言&#xff0c;采用了光纤电缆作为传输介质。光纤传输的优点是速度快、抗干扰能力强。光纤交换机主要有两种&#xff0c;一是用来连接存储的FC交换机。另一种是…

java 调用 js性能_太快了,太变态了:什么会影响Java中的方法调用性能?

java 调用 js性能那么这是怎么回事&#xff1f; 让我们从一个简短的故事开始。 几周前&#xff0c;我提议对Java核心libs邮件列表进行更改 &#xff0c;以覆盖当前final一些方法。 这刺激了一些讨论主题-其中之一是其中一个性能回归通过采取这是一个方法被引入的程度final免遭停…