软件测试之自动化测试

news2024/11/18 10:29:26

目录

一、初试自动化测试

1.自动化测试的分类(简单了解)

2.如何实施自动化单元测试

二、selenium 介绍(重点内容)

1.工作原理

2.Selenium 环境搭建

2.1 Chrome  + java

2.2 常见问题及解决方案

1.元素的定位

1.1 CSS 定位

1.2 CSS选择语法(面试高频)

1.3 XPath 定位

1.5 实现一个自动化需求

2.操作测试对象

2.1 clear 清除对象输入的文本内容

2.2 submit 提交

2.3 getAttribute  获取元素对应属性的值


一、初试自动化测试

自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程;也就是说自动化测试相当于将人工测试手段进行转化,让代码去执行

1.自动化测试的分类(简单了解)

f9297cb053894c74829c1ddfdf4de632.png (701×458)

自动化测试包括 UI测试、接口自动化、单元测试。按照这个金字塔模型来进行自动化测试规划,可以产生最佳的自贡话测试产出投入比(ROI),可以用较少的投入获得很好的收益

  • 单元测试:最大的投入应该在单元测试上,单元测试运行的频率也更加高。
  • 接口自动化 :接口测试就是API测试,相对于UI自动化API自动化更加容易实现,执行起来也更稳定。

可在产品前期,接口完成后介入;用例维护量小;适合接口变动较小,界面变动频繁的项目

常见的接口自动化测试工具有,RobotFramework,JMeter,SoapUI,TestNG+HttpClient,Postman等。

  • UI自动化:虽然测试金字塔告诉我们尽量多做API层的自动化测试,但是UI层的自动化测试更加贴近用户的需求和软件系统的实际业务。并且有时候我们不得不进行UI层的测试。

用例维护量大;页面相关性强,必须后期项目页面开发完成后介入;UI测试适合与界面变动较小的项目

UI 自动化测试的好处:

  • 降低大型系统的由于变更或者多期开发引起的大量的回归测试的人力投入,这可能是自动化测试最主要的任务,特别是在程序修改比较频繁效果是非常明显的,自动化测试前期人力投入较多,但后期进入维护期后,可节省大量人力,而手工测试后期需要增加大量人力用于回归测试
  • 减少重复测试的时间,实现快速回归测试
  • 创建优良可靠的测试过程,减少人为错误
  • 可以运行更多更繁琐的测试
  • 可以执行一些手工测试困难或不可能进行的测试
  • 更好的利用资源
  • 测试脚本的重用性

UI层自动化测试框架:

UI层的测试框架比较多,比如Windows客户端测试的AutoIT,web测试的selenium以及TestPlant eggPlant,Robot framework,QTP等。

测试课程里我们主要以Web UI自动化测试框架Selenium为例进行详细介绍。selenium有以下优点:

  • 免费,也不用再为破解软件而大伤脑筋
  • 小巧,对于不同的语言它只是一个包而已,而QTP 需要下载安装1个多G 的程序。
  • 这也是最重要的一点,不管你以前更熟悉C、java、ruby、python、或都是C# ,你都 可以通过
  • selenium 完成自动化测试,而QTP 只支持VBS
  • 支持多平台:windows、linux、MAC ,支持多浏览器:ie、ffff、safari、opera、chrome
  • 支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器执行,相当于分 发机的功能。

UI自动化测试的适用对象:

实施自动化测试的前提条件:需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用。 适合做自动化的项目:

1️⃣产品型项目。产品型的项目,新版本是在旧版本的基础上进行改进,功能变不大的项目,但项目的新老功能都必须重复的进行回归测试。回归测试是自动化测试的强项,它能够很好的验证你是否引入了新的缺陷,老的缺陷是否修改过来了。在某种程度上可以把自动化测试工具叫做回归测试工具。

2️⃣机械并频繁的测试。每次需要输入相同、大量的一些数据,并且在一个项目中运行的周期比较长。比如兼容性测试。

 以下情况的项目不适合做自动化测试:

1、需求变动频繁的项目,自动化脚本不能重复使用,维护成本太大,性价比低
2、项目周期短,自动化脚本编制完成后使用次数不多,性价比低
3、交互型较强的项目,需要人工干预的项目,自动化无法实施

2.如何实施自动化单元测试

1️⃣分析:总体把握系统逻辑,分析出系统的核心体系架构

2️⃣设计:设计测试用例,测试用例要足够明确和清晰,覆盖面广而精

3️⃣实现:实现脚本,有两个要求一是断言,二是合理的运用参数化

4️⃣执行:执行脚本远远没有我们想象中那么简单。脚本执行过程中的异常需要我们仔细的去分析原因。

5️⃣总结:测试结果的分析,和测试过程的总结是自动化测试的关键。

6️⃣维护:自动化测试脚本的维护是一个难以解决但又必须要解决的问题。

7️⃣分析:在自动化测试过程中深刻的分析自动化用例的覆盖风险和脚本维护的成本

二、selenium 介绍(重点内容)

是用来做 web 自动化测试框架

  • 支持各种浏览器
  • 支持各种平台
  • 支持各种语言(Python、Java、JS...),有丰富的 API

1.工作原理

d96eae3ab1fa47c9bc7ac39b35600610.png (914×592)

通过idea编写代码,然后运行代码,此时相当于创建一个 http 请求(运行的时候在后台运行了一个服务,有了这个服务就可以接收这个请求),这个浏览器驱动就在接收代码发送的请求,并且需要解析成浏览器能够识别一系列的指令;这个时候浏览器就知道了接下来该做什么,到底有没有做成功呢?这个时候浏览器向驱动返回一个结果,再向代码返回一个结果

用Selenium实现自动化,主要需要三个东西: 

  1. 自动化测试代码:自动化测试代码发送请求给浏览器的驱动
  2. 浏览器驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器
  3. 浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。

Selenium脚本执行时后端实现的流程:

  1. 对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
  2. 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
  3. HTTP Server接收到请求后根据请求来具体操控对应的浏览器
  4. 浏览器执行具体的测试步骤
  5. 浏览器将步骤执行结果返回给HTTP Server
  6. HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息。

2.Selenium 环境搭建

环境搭建需要 java 版本最低要求为8,浏览器的使用为 Edge 或者 Chrome 浏览器,我们以 Chrome 浏览器来搭建环境

2.1 Chrome  + java

1️⃣下载chorme 浏览器:Google Chrome 网络浏览器

2️⃣查看chrome浏览器版本

84c299034f634a588f87505aa323a4ef.png (856×283)

3️⃣下载chrome浏览器驱动

ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)

fbbd45f60ae44113bfab01ca301d0a39.png (1850×771) 

找版本前两位数一样的,最后.93找接近的 

 b880772094e84b7794e286f88d7cb7b3.png (1084×356)

 此时找自己电脑的版本,我的是win操作系统,就下载win32;下载之后务必要解压文档❗❗

4️⃣配置环境:在这里配置环境不做解释,如果不会配置和没有配置的小伙伴,可以去看我的博客,有详细的配置环境步骤:(29条消息) Windows下最简单的JDK和IDEA安装教程_idea jdk安装教程_奋斗小温的博客-CSDN博客

5️⃣ 将 .exe 放到 jdk 的 bin 文件中

664ee66db53a495f8ea5b16e7c2c3849.png (1544×529)

 如果此时忘记了 jdk在哪个路径下存放,我可以给大家提供一个简单使用方法:去运行java代码,然后就会看到一下路径,这就是jdk的存放路径 

 e335c5501cf94ebe8113d66ea0da8aa0.png (1228×485)

6️⃣打开idea,创建 maven 项目:在pom文件中添加依赖

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>
</dependencies>

❗❗❗添加完记得刷新页面

7441da1ffc1d4cf899b9faf7cb1bbb32.png (638×235)

在这里需要注意依赖可能添加不成功:这时候我们需要更换一下使用目录

e7588e8e3fbe44eeb56dd440851d5926.png (1231×662)

 这个 settings.xml 文件我会放到资源里边大家可以自行下载

7️⃣验证环境是否搭建成功

5a7759bcdaf34fb78a01bb35e8526e39.png (1771×618)

如果出现以上内容,则说明 selenium环境搭建 已经成功

2.2 常见问题及解决方案

1️⃣SessionNotCreatedException

64799c5a7f214bf284ba91209461d9cb.png (1075×126)

原因:selenium找不到Chrome.exe的安装路径

解决办法:前提——请先确认您下载的谷歌浏览器不是盗版。

驱动实例化中使用绝对路径:

ChromeDriver driver = new ChromeDriver("E:/browser/Google/Chrome/Application/chrome.exe);❗❗注意:这里放同学自己的Chrome.exe所在路径哦,不要盲目复制粘贴~~

2️⃣The version of ChromeDriver only support xxxxxxxxx

3️⃣The path to the driver executable the path to

9fb1a0741427418e8fc2235a562ec8a3.png (1079×391)

 原因:浏览器驱动没有放到系统环境变量下

解决办法(二选一即可):

  1. 找到驱动所在路径,复制路径并添加系统环境变量
  2. 将驱动放到jdk路径下

三、webdriver API

Webdriver (Selenium2.0)是一种用于Web应用程序的自动测试工具

1.元素的定位

假如要测试一个百度网页,输入一个 Test ,是否返回 Test 相关数据❓❓首先我们需要找到百度的输入框在哪里,然后输入相关信息,再去找百度一下这个按钮在哪里,然后去点击它,这就是通常的一个操作;同理代码的测试也是一样的,也需要去找这个元素,再进行操作

元素的定位方法有很多:

  • id 定位
find_element_by_id( )
  • name 定位
find_element_by_name( )
  • tag name 定位和 class name 定位
find_element_by_tag_name( )
  • CSS 定位
  • XPath 定位
  • link text 定位:通过元素标签对之间的文本信息来定位元素。
find_element_by_link_text( )
  • Partial link 定位:是对link定位的补充,有些文本链接比较长,这个时候可以取文本链接的一 部分定位,只要这一部分信息可以唯一地标识这个链接
find_element_by_partial_link_text( )

最主要的是 CSS 定位 和 XPath 定位,也是功能最为强大的,可以找到页面几乎所有的元素

1.1 CSS 定位

首先我们在百度框输入“软件测试”,需要自动化输入:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框:做任何操作都需要驱动进行操作
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));//类选择器
        //输入软件测试
        element.sendKeys("软件测试");
    }

}

a23ff0d4aa6e424a9ab1cd3365a1f864.png (1891×650)

 其中 CSS 类选择器如何找呢?

b476962f1ea046b3a967fe645c0d7363.png (1541×526)

1.2 CSS选择语法(面试高频)

CSS选择语法,我们在学习 CSS 中已经讲解过,在这里不做过多介绍

1️⃣id选择器:#id

2️⃣类选择器:.class名

3️⃣标签选择器:标签名

4️⃣后代选择器:父级选择器/子级选择器

1.3 XPath 定位

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框:做任何操作都需要驱动进行操作
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//xpath 类选择器
        //输入软件测试
        element.sendKeys("软件测试");
    }

}

2299a28b339d4b378871042dc5c5f82f.png (1854×750)

XPath 选择器如何让找呢?

02f4d12a6a784217b4376709da9b4eb7.png (1401×472)

1.4 XPath选择语法(面试高频) 

语法大家可以参考在线教程,讲解的很详细:w3school 在线教程

2ebcaefb3584447880f9c64e82680b44.png (1062×2567)

1️⃣绝对路径:/html/head/title (不常用)

c15f7aeac1d34a6c86b4365946e687e1.png (1328×305)

2️⃣相对路径:

相对路径有很多,这里介绍几种常用的相对路径

  • 相对路径+索引(找下标)://form/span[1]/input

例如我们找百度的输入框:

fb64636c07814cc9a11563acb17b9e6f.png (1372×403)

  • 相对路径+属性值(找相关属性)://input[@class="s_ipt"]

例如我们找百度的输入框class的属性:

​ 1f134975c8eb4dc69a9308ae0a14acb5.png (882×268)

  • 相对路径+通配符://*[@*="s_ipt"]

找所有属性下的s_ipt:

​ 68e0ef60029f48afb09690c818747307.png (930×347)

  • 相对路径+文本匹配:

1.5 实现一个自动化需求

自动化需求:实现一个在百度的输入框中输入”软件测试“,是否返回对应的数据

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import javax.xml.bind.Element;
import java.util.List;
import static java.lang.Thread.sleep;
public class Main {
    public static void main(String[] args) throws InterruptedException {
        test01();
    }
 
    private static void test01() throws InterruptedException {
        int flg = 0;
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框:做任何操作都需要驱动进行操作
        //WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));//类选择器
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//xpath 类选择器
        //输入软件测试
        element.sendKeys("软件测试");
        //找到百度按钮点击并校验
        //1.找到百度按钮并 点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);//等到3s
        //2.校验
        //找到搜索结果
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        for (int i = 0; i < elements.size(); i++) {
            //System.out.println(elements.get(i).getText());
            //如果返回的结果有软件测试,证明测试通过,否则测试不通过
            if (elements.get(i).getText().equals("测试")) {
                flg = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if (flg == 0) {
            System.out.println("测试不通过");
        }
    }

}

98bc34d9dbc54171be853a6a9b5a3a57.png (1847×385)

2.操作测试对象

前面我们学习了元素的定位,但是定位只是第一步,定位之后需要对玄素进行操作,是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作

webdriver 中比较常用的操作对象的方法有下面几个:

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象输入的文本内容
  • submit 提交
  • text 用于获取元素的文本信息
  • getAttribute  获取元素对应属性的值

2.1 clear 清除对象输入的文本内容

自动化需求:打开一个百度的首页,并且在输入框中输入“什么是测试”,并且点击“百度一下”按钮,最后清除输入框内容

如何找输入框和点击一下:打开百度网页,F12,利用选择元素找到输入框和百度一下,查看id:

90a1ca34292b44c1a495de9cb89c734c.png (804×242)

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.List;
import static java.lang.Thread.sleep;
public class Main {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }
 
    //clear 清除对象输入的文本内容
    private static void test02() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        sleep(3000);
        //找到百度输入框的:id为kw,并且输入“什么是测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("什么是测试");
        //找到百度一下按钮:“su”,并且点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //清除百度输入框的中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }
}

37f0606dc7154643b75c21f2038f2d03.png (1556×1194)

2.2 submit 提交

如果点击的元素放在 form 标签中,此时使用 submit 实现的效果和 click 是一样的;如果点击的元素放在非 form 标签中,此时使用 submit 回报错

点击百度中的“新闻”超链接,这个超链接没有放在form标签中,则会报错


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
 
import static java.lang.Thread.sleep;
public class Main2 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }
 
    //submit
    //如果点击的元素放在 form 标签中,此时使用 submit 实现的效果和 click 是一样的;
    //如果点击的元素放在非 form 标签中,此时使用 submit 回报错
    //点击百度中的“新闻”超链接,这个超链接没有放在form标签中,则会报错
    private static void test() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //使用xpath定位,并提交
        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();
 
    }
}

396341019cc84924a3c2fb3c5763dd73.png (1787×383)

这个代码报错的原因就是因为 submit 操作的不是 form 标签的数据

2c04bda9b3f54326877bad1f6e81c087.png (759×167)

 在 click 和 submit 中,推荐使用 click,避免出现错误

2.3 getAttribute  获取元素对应属性的值

自动化需求:找到“百度一下”按钮,这个按钮属于一个属性,没有放在标签中间,不可以通过 test 来获取,这个时候需要通过getAttribute  获取元素对应属性的值

e4a1e731051d4100839e862567afd15d.png (1411×339)


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
 
public class Main3 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }
 
    //getAttribute 获取元素对应属性的值
    private static void test() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //获取属性的值
        String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        if (button_value.equals("百度一下")) {
            System.out.println("测试通过");
        } else {
            System.out.println(button_value);
            System.out.println("测试不通过");
        }
    }
}

3038e6ba95ae48d8a079e9b1ee337c93.png (1793×381)

 


🌈目前我们已经学习了webdriver API 中元素的定位、操作测试对象,但是不仅仅是这两个方面,还有很多,本文我们简单介绍一下自动化测试,由于今天要学的知识有很多,所以下次测试课我们继续讲解 webdriver API,请继续关注我,下节课是本章自动化测试的一个核心知识点+高频面试题❗❗❗

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

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

相关文章

sonarqube分析仓库

sonarqube可以有多种方式分析仓库 使用GitlabCI 设置项目编码 添加环境变量 创建或修改配置文件 sonarqube-check:image: name: sonarsource/sonar-scanner-cli:latestentrypoint: [""]variables:SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defi…

GE H201Ci-1 单通道变压器控制单元

HYDRAN 201Ci-1一个标准模拟输出通道控制器非隔离&#xff0c;跳线可配置为0-l mA 一个遥控电子控制器或4-20 mA&#xff08;最大输出10 V&#xff09;、0-1 V或0-10 V&#xff1b;0-2000 ppm范围 HYDRANR 201Ti智能变送器&#xff1b;它提供网络通信能力 第二个可选模拟输出加…

基于Web的智慧产业园区3D可视化运营管理平台

改革开放以来&#xff0c;园区逐渐成为地区招商引资、储备人才的重要途径。我国社会、经济处于快速发展阶段&#xff0c;园区正向着智慧化、创、科技化转变。 建设背景 在人类的历史发展过程中&#xff0c;随着5G、人工智能、云计算、物联网、GIS等新一轮信息技术的迅速发展&…

Jenkins流水线整合k8s实现代码自动集成和部署

一、前置条件 1、安装好k8s集群 这里先要搭建好一个K8s集群&#xff0c;笔者这边就采用使用了一个一主一丛的k8s集群&#xff0c;k8s集群的版本使用1.19.5版本&#xff0c;服务器的配置&#xff1a;2核4G&#xff0c;操作系统: CentOS Linux release 7.9.2009 (Core) 主机名…

Rabbitmq 下载与安装

文章目录 说明1、下载Erlan2、下载对应的rabbitmq 说明 Rabbitmq依赖于Erlan 对应版本查看&#xff1a;https://www.rabbitmq.com/which-erlang.html 这里版本使用&#xff1a; Rabbitmq 3.9.11 Erlan 24.1.7 1、下载Erlan https://www.erlang.org/patches/otp-24.1.7 安装完…

matlab代码复现:室内定位、无线传感器网路定位、估计优化滤波等探讨及技术支持

室内外定位导航、无线传感器网路定位、估计优化滤波等探讨及技术支持 博主主要擅长以下几个方面&#xff0c;探讨、技术支持、代码复现等问题欢迎联系&#xff0c;也可以站内私信 weixin: ZB823618313&#xff08;备注来意&#xff09; 1. 估计\滤波\融合 1 各种参数估计算法…

ChatGPT智能聊天系统1.0.3版本发布啦~

ChatGPT智能聊天系统1.0.3版本啦&#xff01;主要更新内容如下&#xff1a; 新增功能 获取微信昵称 支付宝支付 PC端允许退出登录 PC端创作和技能支持关键词搜索 分享记录添加今日分享统计 邀请记录添加今日邀请和今日发放统计 细节优化 模型对话框去掉快递发送功能 后…

bioinformatics2022 | Sc2Mol+:使用VAE和Transformer的两阶段基于骨架的分子生成

原文标题&#xff1a;Sc2Mol&#xff1a;a scaffold-based two-step molecule generator with variational autoencoder and transformer 论文地址&#xff1a;Sc2Mol: a scaffold-based two-step molecule generator with variational autoencoder and transformer | Bioinfo…

3 分钟利用 FastGPT 和 Laf 将 ChatGPT 接入企业微信

原文链接&#xff1a;https://forum.laf.run/d/556 FastGPT 是一个超级&#x1f42e;&#x1f37a;的 ChatGPT 平台项目&#xff0c;功能非常强大&#xff1a; ✅ 集成了 ChatGPT、GPT4 和 Claude ✅ 可以使用任意文本来训练自己的知识库、文档库&#xff0c;而且知识库专有模…

无人值守的IDC机房动环综合运维方案

企业数字化转型以及5G、物联网、云计算、人工智能等新业态带动了数据中心的发展&#xff0c;在国家一体化大数据中心及“东数西算”节点布局的推动下&#xff0c;数据中心机房已成为各大企事业单位维持业务正常运营的重要组成部分&#xff0c;网络设备、系统、业务应用数量与日…

16-01 云平台分类和思考

云环境的分类 混合云 为什么选择混合云 混合云网络互联 入口层分流 CDN内容分发网络 CDN工作原理 Captcha图灵测试 SLB软件负载均衡器 SDN&#xff1a;软件定义网络网络层次&#xff1a;通用网络&#xff08;2-4层&#xff09;和HTTP&#xff08;5-7层&#xff09;多种实现…

Espresso Sequencer:针对Rollup生态的Decentralized Shared Sequencing Layer

1. 引言 前序博客&#xff1a; Rollup去中心化Rollup DecentralizationAztec 征集 Rollup Sequencer去中心化提案Espresso Sequencer&#xff1a;去中心化RollupsRadius&#xff1a;针对Rollup生态的Trustless Shared Sequencing层 当前的L2 Rollup方案在扩容的同时&#xf…

Maven的生命周期详解

目录 一、生命周期&#xff08;cleansitedefault&#xff09;1、生命周期与插件的关系2、maven的三套生命周期3、生命周期执行规则 二、Maven插件&#xff08;plugin&#xff09;1、两种类型的插件2、调用插件有两种方式3、内置绑定4、自定义绑定插件 三、官网查找插件 本篇文章…

《Go专家编程(第2版)》书评

首先感谢官方的肯定&#xff0c;让我在【图书活动第四期】的活动中获得了《Go专家编程(第2版)》这本书&#xff0c;以下是从我的观点对这本书的书评 文章目录 前言书籍部分读者评价总结 前言 很高兴有机会写一篇关于《Go专家编程&#xff08;第2版&#xff09;》的书评。大致读…

Scrum进入疲惫期?三点帮你走出困境

《敏捷软件开发》中提到&#xff1a;“Scrum可以帮助团队更好地应对变化和不确定性&#xff0c;以及更快地响应客户需求。通过持续的反馈和改进&#xff0c;Scrum可以提高团队的适应性和灵活性。” 然而&#xff0c;有些团队在使用Scrum后&#xff0c;却出现了工作任务越来越多…

在线搭建产品FAQ常用问题的网页Tips清单

在线搭建产品FAQ&#xff08;常见问题解答&#xff09;页面&#xff0c;是现代企业建立客户服务体系中的重要组成部分&#xff0c;旨在通过提供问题解答&#xff0c;为客户提供更好的用户体验。 在线搭建产品FAQ网页的常用Tips清单&#xff1a; 确定FAQ的主题和范围 在创建FAQ…

c# 自定义安装程序路径(设置安装路径多一层目录)+卸载前执行操作

打包成setup.exe的完整流程可以参考&#xff1a;将WinForm项目打包成exe安装包&#xff0c;并创建快捷方式 (vs2019)_winform发布成exe-CSDN博客 以下内容默认大家已经知道打包的完整流程。 一、自定义安装目录 真的好讨厌安装程序直接安装到选择的路径&#xff0c;不新建目录…

【006】C++数据类型之进制间的转换

C数据类型之进制间的转换 引言一、进制的概述二、十进制转二进制、八进制、十六进制&#xff08;短除法&#xff09;三、二进制、八进制、十六进制转十进制&#xff08;位次幂&#xff09;四、其他进制间的转换4.1、二进制转八进制4.2、二进制转十六进制4.3、八进制转二进制4.4…

Ubuntu18.04+Xenomai-3.2.1下安装igH EtherCAT Master

一、安装Xenomai-3.2.1 Ubuntu18.04安装Xenomai实时内核https://blog.csdn.net/m0_56451176/article/details/130608887?spm=1001.2014.3001.5501 二、安装igH EtherCAT Master 2.1安装所需工具 sudo apt install autoconf autogen libtool 2.2下载IgH源码 EtherCAT安装…

赤道Kelvin和Rossby波 Part-1(简要介绍)

Equatorial Kelvin and Rossby Waves 赤道Kelvin和Rossby波&#xff1b;在该部分简要介绍 Kelvin waves和Rossby waves是海洋对西风突发等外界作用力变化的调整方式。这种调整是通过受重力、科氏力f以及科氏力的南北变化 ∂ f / ∂ y β \partial f/\partial yβ ∂f/∂yβ影响…