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

selenium并行

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

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

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

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

什么是Selenium网格?

在开始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驱动程序的第一个节点,在端口5566上运行Firefox驱动程序的第二个节点,在端口4547上运行IE浏览器的第三个节点。这是输出屏幕截图供进一步参考:

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

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

现在该进行一些自动化的跨浏览器测试了! 我将运行一个自动化脚本,演示Selenium Grid的并行执行。 该脚本将在Chrome,Firefox和Internet Explorer上并行运行,而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,则脚本将显示错误。 当您选择与测试计算机的操作系统相比不同的操作系统时,会发生相同的情况。

此外,每次启动新的OS时,在新的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

selenium并行

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

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

相关文章

java 发展简史

【0】README 0.1&#xff09; 本文转自 core java volume 1&#xff0c;仅供了解Java 的发展历史&#xff0c;它的前世今生&#xff0c;所谓知己知彼&#xff0c;百战不殆&#xff08;just a joke&#xff09; &#xff1b; 【1】java 发展简史 1.1&#xff09;java的历史要…

axios代理跨域 cli4_跨域本质及解决办法

1、什么是跨域&#xff1f;2、如何解决&#xff1f;跨域是前端所独有的&#xff0c;后端不存在跨域问题。是浏览器的一种安全保护手段&#xff0c;为了防止别人抓取、篡改你的网站数据信息。遵循同源策略、同协议&#xff08;http&#xff09;、同域名、同端口&#xff0c;少一…

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

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

Java 相关术语

【0】README 0.1&#xff09; 本文转自 core java volume 1&#xff0c;仅供了解Java 的相关术语&#xff0c;包括像JDK、JRE等 &#xff1b;而且我感觉&#xff0c;了解了这些过后&#xff0c;你会更懂 Java&#xff0c; 更热爱它&#xff1b; 【2】Java术语 2.1&#xff09;…

一般试卷的纸张大小是多少_pdf试卷怎么打印在A3纸上

一般的PDF试卷的纸张大小都是A4大小&#xff0c;没有现成A3大小Word文档的试卷时&#xff0c;需要将PDF试卷转换Word文档之后进行排版&#xff0c;如何实现这一操作呢&#xff1f;请接着往下学习吧~一、将试卷的PDF格式转换为Word1.进入PDF快转官网&#xff0c;点击下载按钮下载…

设置 JDK环境变量(Windows)

【0】README 0.1&#xff09; 本文转自 core java volume 1&#xff0c;旨在说明如何设置 JDK环境变量&#xff0c;以及为什么要设置的问题&#xff1b;【1】JDK目录树 Attention&#xff09;就Java 而言&#xff0c; docs 和 src 是两个最有用的子目录&#xff1a;因为 docs …

光流法测试代码_高效的企业测试-工作流和代码质量(4/6)

光流法测试代码本文的这一部分将讨论在开发过程中拥有有效工作流程的影响&#xff0c;以及适当的测试代码质量如何使我们能够创建可维护的测试&#xff0c;尤其是对于复杂项目。 开发工作流程和管道 编程是一项流程活动&#xff0c;我们开发人员应该对保持工作流程高效和缩短…

水泵怎么做_泳池设备日常怎么维护和保养?

点击上方“蓝字”&#xff0c;关注我们.●电机突然停止运转怎么办&#xff1f;1.检查电路和电线接口等。2.检查输送到电机的电压是否过低(通常由于电源线太小而引致的电流不足)。3.检查是否有过载而引起电流过大。注&#xff1a;Hayward 水泵的单相电机有自动过热保护装置。该装…

鸡肉部位英文对照_鸡肉和鸡蛋–测试前解决Spring属性

鸡肉部位英文对照考虑一个负责进行远程调用和获取详细信息的服务类&#xff1a; ... public class CitiesService { private final WebClient.Builder webClientBuilder; private final String baseUrl; public CitiesService( WebClient.Builder webClientBuilder, Value ( &…

git pull忽略指定文件_Git忽略提交规则

在使用Git的过程中&#xff0c;我们喜欢有的文件比如日志&#xff0c;临时文件&#xff0c;编译的中间文件等不要提交到代码仓库&#xff0c;这时就要设置相应的忽略规则&#xff0c;来忽略这些文件的提交。简单来说一个场景&#xff1a;在你使用git add .的时候&#xff0c;遇…

lombok var_使用var,Lombok和Fluxtion轻松处理事件

lombok var介绍 在本文中&#xff0c;我将结合使用Lombok和Fluxtion这两种产品&#xff0c;以展示工具如何在减少代码编写和交付时间的同时提高代码的可读性。 使用Java 10中的var可以进一步改善这种情况。 产品和var都在构建时使用推断来加速开发。 Fluxtion的精神是最大程度…

更换mysql_安利给你,关于MySQL字符集乱码与解决方案

推荐阅读&#xff1a;闭关修炼21天&#xff0c;“啃完”283页pdf&#xff0c;我终于4面拿下字节跳动offer肺炎在家“闭关”&#xff0c;阿里竟发来视频面试&#xff0c;4面顺利拿下offer字符集是一套符号和编码的规则&#xff0c;不论是在oracle数据库还是在mysql数据库&#x…

api自动化_如何在不增加人员的情况下自动化API安全程序

api自动化在这篇文章中&#xff0c;我们将撰写一篇综合文章&#xff0c;内容涉及如何在不增加人员的情况下自动执行API安全程序。 在现代世界中&#xff0c;数据对于提供者和消费者都至关重要。 数据科学的出现证明了这一事实。 对于某些组织&#xff0c;整个业务模型是建立在信…

kali用x-shell连接_良心国产工具,比Xshell好用还免费!

使用或维护Linux系统的都知道&#xff0c;我们日常对服务器的操作&#xff0c;一般都会借助SSH工具远程登录到服务器之后进行操作。常用的SSH工具有不少&#xff0c;比如&#xff1a;Xshell、Putty、SSH Secure Shell Client、secureCRT等等。民工哥使用过其中两种secureCRT和X…

ibm liberty_使用Open Liberty的开发模式最大程度地缩短周转时间

ibm liberty我上传了一个视频&#xff0c;其中显示了如何在编写部署在Open Liberty上的Enterprise Java应用程序时减少周转时间。 Maven插件的liberty:dev目标监视文件更改并立即应用更改&#xff0c;而无需重建整个部署工件。 我将展示在更改源代码&#xff0c;配置&#xff…

vue 分模块打包 脚手架_一步步从头搭建 Vue 开发环境

前言由于是工具&#xff0c;很可能你看到的时候有些工具包已经升级了&#xff0c;会有一些报错&#xff1b;这个你就需要自己探索了。工具的版本node: v10.16.0npm: v6.9.0babel: 7.5.5webpack: 4.38.0入题提醒&#xff1a;在我们开始之前&#xff0c;你先检查下你相关工具的包…

stomp java客户端_Stomp-Spring服务器端的Web套接字Java客户端

stomp java客户端问题&#xff1a; 为了分析问题&#xff0c;我不得不编写一个简单的Java Web套接字客户端站点代码&#xff0c;并使用基于stomp的Web套接字代理连接到服务器端基于Spring的应用程序。 解决方案&#xff1a; pom.xml <?xml version"1.0" encodi…

tf.metrics._将指标标签与MicroProfile Metrics 2.0一起使用

tf.metrics.从我们的应用程序发出的与业务相关的度量标准可能包含要为其测量特定度量标准的参数&#xff08;即标签或标签 &#xff09;。 从MicroProfile Metrics 2.0开始&#xff0c;可以使用API​​将标签分配给特定的指标。 声明式方法 假设我们有以下资源&#xff1a; P…

ppt课堂流程图_除了直线能设计PPT,没想到曲线也实用,太赞了!

前几天在分享PPT设计的方法时&#xff0c;收到反馈&#xff0c;问这种曲线是如何设计以及怎么用&#xff1f;其实对于曲线&#xff0c;如果用好了比直线更加有效果&#xff0c;曲线本身自带动态效果&#xff0c;看一下。除此之外&#xff0c;曲线不仅可以用在PPT中&#xff0c;…

算法分析

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff1b;旨在了解 算法分析涉及到的数学基础、时间复杂度分析法则、和其它的一些法则 和 结论&#xff1b; 【1】 数学基础 1.1&#xff09;本书将使用以下4个定义&#xff1a; 对上述定义的分析&#xff0…