自动化测试实战-Growing_Notes

下面我们将对之前做过的一个项目进行自动化测试。项目链接:Growing_Notes

目录

  一、脑图编写 Web 自动化测试用例

 二、创建测试项目(Java)

  三、根据脑图设计Growing_Notes自动化测试用例

1.准备工具类

2.测试Growing_Notes注册页

3.测试Growing_Notes登录页

4.测试个人博客列表页

5.测试博客列表主页

6.测试博客编辑页

7.测试博客详情页

8.创建测试套件

  四、自动化测试

如何实现?

自动化实战亮点:



一、脑图编写 Web 自动化测试用例

 二、创建测试项目(Java)

  1. 创建Maven项目
  2. 在test包下管理自己的测试代码
  3. 导入自动化测试需要的相关依赖

pom.xml中 引入测试依赖:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>

三、根据脑图设计Growing_Notes自动化测试用例

1.准备工具类

在common包下创建 AutoTestUtils 类,该类需要提供一下功能:

  1. 创建驱动对象,提供给其他页面使用
  2. 创建隐式等待,作用于软件测试的整个生命周期
  3. 提供屏幕截图方法,以及保存截图的格式
package common;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

/**
 * @author SunYuHang
 * @date 2023-04-07 09:42
 * @ClassName : AutoTestUtils  //类名
 */

public class AutoTestUtils {
    public static EdgeDriver driver;

    // 创建驱动对象
    public static EdgeDriver getDriver() {
        if(driver == null) {
            //由于selenium版本问题,加两句代码
            EdgeOptions options = new EdgeOptions();
            options.addArguments("--remote-allow-origins=*");
            driver = new EdgeDriver(options);
       
        }
        // 创建隐式等待,作用于driver的整个生命周期 (10秒)
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        return driver;
    }

    // 屏幕截图, 保存文件的格式
    public List<String> getTime() {
        // 文件夹按照天数的维度进行保存
        // 文件格式 2023-4-3 20:07
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");
        SimpleDateFormat sim2 = new SimpleDateFormat("yyyy-MM-dd");
        String filename = sim1.format(System.currentTimeMillis());
        String dirname = sim2.format(System.currentTimeMillis());
        List<String> list = new ArrayList<>();
        list.add(dirname);
        list.add(filename);
        return list;
    }

    // 屏幕截图的方法
    public void getScreenShotAs(String str) throws IOException {
        List<String> list = getTime();
        String filePath = "./src/test/java/com/blogWebAutoTest/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";
        File srcFile = driver.getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(srcFile, new File(filePath));
    }
}

在 Tests 包下创建 DriverQuitTest 类,该类主要是用来释放驱动的。 

package Tests;

import common.AutoTestUtils;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.edge.EdgeDriver;

/**
 * @author SunYuHang
 * @date 2023-04-07 09:47
 * @ClassName : DriverQuitTest  //类名
 */

public class DriverQuitTest extends AutoTestUtils {
    public static EdgeDriver driver;
    @Test
    void driverQuit(){
        driver = getDriver();
        driver.quit();
    }
}

2.测试Growing_Notes注册页

创建 BlogRegTest 类,该类的测试用例主要有四个:

  • 注册页面是否能够正常打开
  • 输入用户名,密码,确认密码,且用户名第一次注册,密码和确认密码一致。【两次弹窗】
  • 输入用户名,密码,确认密码,且用户名第一次注册,密码和确认密码不一致。【一次弹窗】
  • 输入用户名,密码,确认密码,用户名不是第一次注册。【弹窗提示用户名已被使用】
  • 其他情况【用户名为空,密码为空,确认密码为空都是一次弹窗这里就不测了】

主类代码:

package Tests;

import common.AutoTestUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.IOException;

/**
 * @author SunYuHang
 * @date 2023-04-07 10:35
 * @ClassName : BlogRegTest  //类名
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogRegTest extends AutoTestUtils {
    public static EdgeDriver driver;
    @BeforeAll
    static void baseController(){
        driver = getDriver();
        driver.get("http://43.140.252.242:9090/login.html");
    }
    /**
     * 检查注册成页面是否能够正常打开
     * 检查登陆页面的登录按钮,以及确认密码是否出现
     */
    @Test
    @Order(1)
    void regPageLoadRight() throws IOException {
        //点击注册按钮
        driver.findElement(By.cssSelector("#sign-up-btn")).click();
        //确认密码
        driver.findElement(By.cssSelector("#password2"));
        //登录按钮
        driver.findElement(By.cssSelector("#sign-in-btn"));
        //截图
        getScreenShotAs(getClass().getName());
    }
    /**
     * 检查正常注册情况
     * 两次弹窗
     */
    @ParameterizedTest
    @CsvSource({"孙宇航,123,123"})
    @Order(2)
    void regSuccess(String username,String password1,String password2) throws IOException,InterruptedException{
        //注册之前先清空用户名,密码和确认密码
        driver.findElement(By.cssSelector("#username1")).clear();
        driver.findElement(By.cssSelector("#password1")).clear();
        driver.findElement(By.cssSelector("#password2")).clear();
        //注册步骤
        driver.findElement(By.cssSelector("#username1")).sendKeys(username);
        driver.findElement(By.cssSelector("#password1")).sendKeys(password1);
        driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
        driver.findElement(By.cssSelector("body > div.containers.sign-up-mode > div.forms-container > div > div.sign-up-form > input")).click();
        //检查注册结果,第一个弹窗显示注册成功,第二个弹窗显示是否要去登陆页面
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        //警告弹窗
        alert.accept();
        //确认弹窗
        Thread.sleep(100);
        alert.dismiss();
        getScreenShotAs(getClass().getName());
    }
    /**
     * 检查注册失败情况 1
     * 账号已存在
     */
    @ParameterizedTest
    @CsvSource({"admin,admin,admin"})
    @Order(3)
    void regFail1(String username,String password1,String password2) throws IOException,InterruptedException{
        //注册之前先清空用户名,密码和确认密码
        driver.findElement(By.cssSelector("#username1")).clear();
        driver.findElement(By.cssSelector("#password1")).clear();
        driver.findElement(By.cssSelector("#password2")).clear();
        //注册步骤
        driver.findElement(By.cssSelector("#username1")).sendKeys(username);
        driver.findElement(By.cssSelector("#password1")).sendKeys(password1);
        driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
        driver.findElement(By.cssSelector("body > div.containers.sign-up-mode > div.forms-container > div > div.sign-up-form > input")).click();
        //检查注册失败场景
        //切换弹窗,进行弹窗的处理 (隐式等待不生效,不得不加入强制等待)
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        //警告弹窗
        alert.accept();
        getScreenShotAs(getClass().getName());
    }

    /**
     * 检查注册失败情况 2
     * 密码和确认密码不一致
     * @param username
     * @param password1
     * @param password2
     * @throws IOException
     * @throws InterruptedException
     */
    @ParameterizedTest
    @CsvSource({"孙宇航,123,456"})
    @Order(4)
    void regFail2(String username,String password1,String password2) throws IOException,InterruptedException{
        //注册之前先清空用户名,密码和确认密码
        driver.findElement(By.cssSelector("#username1")).clear();
        driver.findElement(By.cssSelector("#password1")).clear();
        driver.findElement(By.cssSelector("#password2")).clear();
        //注册步骤
        driver.findElement(By.cssSelector("#username1")).sendKeys(username);
        driver.findElement(By.cssSelector("#password1")).sendKeys(password1);
        driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
        driver.findElement(By.cssSelector("body > div.containers.sign-up-mode > div.forms-container > div > div.sign-up-form > input")).click();

        //检查注册失败场景
        //切换弹窗,进行弹窗的处理 (隐式等待不生效,不得不加入强制等待)
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        //警告弹窗
        alert.accept();
        getScreenShotAs(getClass().getName());
    }
}

上述测试结果:

@Order(1)
/**
 * 上述结果 正常打开
 */
@Order(2)
/**
 * 上述结果 正常注册
 */
@Order(3)
/**
 * 上述结果 注册失败
 */
@Order(4)
/**
 * 上述结果 注册失败
 */

 测试结果截图在相关目录下:


3.测试Growing_Notes登录页

创建 BlogLoginTest 类,该类的测试用例主要有六个:

  • 登录页面是否能够正常打开
  • 用户名,密码都不输入,点击提交
  • 不输入用户名,输入密码,点击提交
  • 输入用户名,不输入密码,点击提交
  • 输入错误的用户名,密码,点击提交
  • 输入正确的用户名,密码,点击提交

主类代码:

package Tests;

import common.AutoTestUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.IOException;

/**
 * @author SunYuHang
 * @date 2023-04-07 10:35
 * @ClassName : BlogLoginTest  //登录测试用例
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogLoginTest extends AutoTestUtils {
    public static EdgeDriver driver;

    @BeforeAll
    static void baseController() {
        driver = getDriver();
        driver.get("http://43.140.252.242:9090/login.html");
    }

    /**
     * 检查登录页面是否正常打开
     * 检查登录页的登录,用户名,密码字样是否出现
     */
    @Test
    @Order(1)
    void loginPageLoadRight() throws IOException {
        //登录按钮
        driver.findElement(By.cssSelector("body > div.containers > div.forms-container > div > div.sign-in-form > input"));
        //用户名
        driver.findElement(By.xpath("/html/body/div[2]/div[1]/div/div[1]/div[1]/input"));
        //密码
        driver.findElement(By.xpath("/html/body/div[2]/div[1]/div/div[1]/div[2]/input"));
        //截图
        getScreenShotAs(getClass().getName());
    }

    /**
     * 检查异常登录的情况 4 种情况
     * 账号密码错误,会有弹窗提示
     * 4.未输入用户名和密码
     */
    @ParameterizedTest
    @CsvSource({"admin"})
    @Order(2)
    void loginFail1() throws IOException, InterruptedException {
        //登录之前先清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //登录步骤
        driver.findElement(By.cssSelector("body > div.containers > div.forms-container > div > div.sign-in-form > input")).click();
        //检查登录失败的场景
        // 切换到弹窗,进行弹窗处理(隐式等待不生效,不得不加入强制等待)
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        //警告弹窗
        alert.accept();
        getScreenShotAs(getClass().getName());
    }

    /**
     * 检查异常登录的情况 4 种情况
     * 账号密码错误,会有弹窗提示
     * 3.未输入用户名
     */
    @ParameterizedTest
    @CsvSource({"admin"})
    @Order(3)
    void loginFail2(String password) throws IOException, InterruptedException {
        //登录之前先清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //登录步骤
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("body > div.containers > div.forms-container > div > div.sign-in-form > input")).click();
        //检查登录失败的场景
        // 切换到弹窗,进行弹窗处理(隐式等待不生效,不得不加入强制等待)
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        //警告弹窗
        alert.accept();
        getScreenShotAs(getClass().getName());
    }

    /**
     * 检查异常登录的情况 4 种情况
     * 账号密码错误,会有弹窗提示
     * 2.未输入密码
     */
    @ParameterizedTest
    @CsvSource({"admin"})
    @Order(4)
    void loginFail3(String username) throws IOException, InterruptedException {
        //登录之前先清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //登录步骤
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("body > div.containers > div.forms-container > div > div.sign-in-form > input")).click();
        //检查登录失败的场景
        // 切换到弹窗,进行弹窗处理(隐式等待不生效,不得不加入强制等待)
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        //警告弹窗
        alert.accept();
        getScreenShotAs(getClass().getName());
    }

    /**
     * 检查异常登录的情况 4 种情况
     * 账号密码错误,会有弹窗提示
     * 1.账号密码错误
     */
    @ParameterizedTest
    @CsvSource({"admin456,123", "孙宇航123,456"})
    @Order(5)
    void loginFail4(String username, String password) throws IOException, InterruptedException {
        //登录之前先清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //登录步骤
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("body > div.containers > div.forms-container > div > div.sign-in-form > input")).click();
        //检查登录失败的场景
        // 切换到弹窗,进行弹窗处理(隐式等待不生效,不得不加入强制等待)
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        //警告弹窗
        alert.accept();
        getScreenShotAs(getClass().getName());
    }


    /**
     * 检查正常登录情况
     * 页面是否显示用户名,密码,登录字样
     */
    @ParameterizedTest
    @CsvSource({"admin,admin", "孙宇航,123"})
    @Order(6)
    void loginSuccess(String username, String password) throws IOException {
        //登录之前先清空用户名和密码
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        //登录步骤
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("body > div.containers > div.forms-container > div > div.sign-in-form > input")).click();
        //检查登录结果(检查我的列表页的查看详情按钮)
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.mydetail > a:nth-child(1) > b"));
        getScreenShotAs(getClass().getName());
        //一个用户测试完了,需要进行回退
        driver.navigate().back();
    }

}

 

可以看出六个测试用例全部进行了测试,测试结果截图也有保存 。


4.测试个人博客列表页

创建 MyBlogListTest 类,该类的测试用例主要有一个:

  • 我的博客列表页能否可以正常显示

主类代码:

package Tests;

import common.AutoTestUtils;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.IOException;

/**
 * @author SunYuHang
 * @date 2023-04-07 10:36
 * @ClassName : MyBlogListTest  //类名
 */

public class MyBlogListTest extends AutoTestUtils {
    public static EdgeDriver driver;
    //创建驱动对象
    @BeforeAll
    static void baseController(){
        driver = getDriver();
        driver.get("http://43.140.252.242:9090/myblog_list.html");
    }
    /**
     * 个人博客列表页可以正常显示
     */
    @Test
    void MyListPageLoadRight() throws IOException{
        //查看是否有修改、删除按钮

        driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.mydetail > a:nth-child(2) > b"));
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.mydetail > a:nth-child(3)"));
        getScreenShotAs(getClass().getName());

    }
}

5.测试博客列表主页

创建 EveryBlogListTest 类,该类的测试用例只有一个:

  • 博客列表主页能否正常显示

主类代码:

package Tests;

import common.AutoTestUtils;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.IOException;

/**
 * @author SunYuHang
 * @date 2023-04-07 10:36
 * @ClassName : EveryBlogTest  //类名
 */

public class EveryBlogListTest extends AutoTestUtils {
    public static EdgeDriver driver;

    @BeforeAll
    static void baseController() {
        driver = getDriver();
        driver.get("http://43.140.252.242:9090/blog_list.html");
    }

    /**
     * 大家的列表页能否正常显示
     * @throws IOException
     */
    @Test
    void everyListPageLoadRight() throws IOException {
        //个人中心
        driver.findElement(By.cssSelector("body > div.nav > a"));
        //查看详情
        driver.findElement(By.cssSelector("#listDiv > div:nth-child(1) > a"));
        getScreenShotAs(getClass().getName());
    }
}

6.测试博客编辑页

创建 BlogEditTest 类,该类有两个测试用例:

  • 检查编辑页是否可以正常打开
  • 测试填写博客标题和正文,是否可以正常发布博客

主类代码:

package Tests;
import common.AutoTestUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.IOException;
/**
 * @author SunYuHang
 * @date 2023-04-07 10:36
 * @ClassName : BlogEditTest  //类名
 */

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest extends AutoTestUtils {
    public static EdgeDriver driver;

    @BeforeAll
    static void baseController() {
        driver = getDriver();
        driver.get("http://43.140.252.242:9090/blog_edit.html");
    }
    /**
     * 检查博客编辑页可以正常打开
     */
    @Test
    @Order(1)
    void editPageLoadRight() throws IOException {
        // 检查正文中 "在这里写下一篇博客"
        driver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));
        // 检查编辑器上的 H5 标题
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(17) > a > i"));
        getScreenShotAs(getClass().getName());
    }

    /**
     * 测试填写博客标题, 博客正文, 是否能够正常发布博客
     * @throws InterruptedException
     * @throws IOException
     */
    @Test
    @Order(2)
    void editAndSubmitBlog() throws InterruptedException, IOException {
        String expect = "孙宇航 vs Java";
        driver.findElement(By.cssSelector("#title")).sendKeys(expect);
        // 因博客系统使用到的编辑器是第三方插件, 所以不能直接使用 sendKeys 向编辑器发送文本,使用下划线,斜线代替
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(6) > a > i")).click();
        driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        // 获取我的列表页第一条博客的标题文本, 检查是否符合预期
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        getScreenShotAs(getClass().getName());
        String actual = driver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.title")).getText();
        Assertions.assertEquals(expect,actual);
    }
}

7.测试博客详情页

创建 BlogDetailTest 类,该类的测试用例只有一个:

  • 测试博客详情页显示是否符合预期

主类代码:

package Tests;

import common.AutoTestUtils;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;

import java.io.IOException;

/**
 * @author SunYuHang
 * @date 2023-04-07 10:37
 * @ClassName : BlogDetailTest  //类名
 */

public class BlogDetailTest extends AutoTestUtils {
    public static EdgeDriver driver;

    @BeforeAll
    static void baseController() {
        driver = getDriver();
        driver.get("http://43.140.252.242:9090/blog_content.html?id=3");
    }
    /**
     * 测试博客详情页显示是否符合预期
     * @throws IOException
     */
    @Test
    void detailPageLoadRight() throws IOException {
        driver.findElement(By.cssSelector("#title"));
        driver.findElement(By.cssSelector("#date"));
        getScreenShotAs(getClass().getName());
    }
}

8.创建测试套件

因为后面个人博客列表,博客编辑这些需要在登录之后才可以测试,所以使用测试套件来管理整个测试流程。

创建 RunSuite 类,该类式用来指定那些测试类需要运行,以及运行顺序的。

package Tests;

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

/**
 * @author SunYuHang
 * @date 2023-04-07 10:37
 * @ClassName : RunSuite  //测试套件
 */
@Suite
@SelectClasses({BlogRegTest.class,BlogLoginTest.class,MyBlogListTest.class,EveryBlogListTest.class,
        BlogEditTest.class,BlogDetailTest.class,DriverQuitTest.class})
public class RunSuite {
}

 我们可以看出所有的测试用例都执行了一遍。

四、自动化测试

如何实现?

  1. 根据自己的项目,用脑图的形式设计一个UI自动化测试用例;
  2. 根据测试用例使用 selenium4 自动化测试工具 和 Junit5 单元测试框架结合实现 Web 自动化测试;
  3. 进行精准的模块划分:我分为了工具类包和测试用例包两个包,工具包主要是来创建驱动对象的,避免在自动化测试的时候,每次都要创建驱动对象;测试用例包一个页面一个测试类,然后将这些测试类整合到测试套件类里;
  4. 实现自动化测试项目。

自动化实战亮点:

  1. 使用 Junit5 中提供的注解,避免产生过多的对象,造成资源和时间的浪费,提高了自动化的执行效率;
  2. 只创建一次驱动对象,避免每次使用每次创建的问题造成时间和资源的浪费;
  3. 用例使用了参数化:保持用例的简洁,提高了代码的可读性;
  4. 使用测试套件,降低工作量,通过套件指定测试类运行;
  5. 使用了等待,提高了自动化运行效率,提高了自动化的稳定。
  6. 使用了屏幕截图,方便问题的追溯以及解决。

孙宇航_
关注 关注
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
AIGC实战——基于Transformer实现音乐生成
盼小辉丶的博客
04-24 4495
Transformer 是最流行的音乐生成技术之一,因为音乐可以视为一个序列预测问题,Transformer 模型将音符视为一个个符号的序列(类似于句子中的单词),从而用于生成音乐。Transformer 模型基于先前音符预测下一个音符,生成音乐作品。在本节中,将学习如何处理音乐数据,并应用 Transformer 生成与给定训练集风格相似的音乐。
大话测试数据(二):概念测试数据的获取
软件测试小迷糊
04-22 283
测试数据在整个测试过程中扮演着极为重要的角色,但是它却像个没有星象的演员,明明至少是男二号,但总是被观众忽略。在测试过程中,我们往往在测试计划阶段就忽略了测试数据,在起先没有给测试数据的设计、准备留出足够的时间,投入足够的精力,到了测试执行阶段追悔莫及。 只有吃过大亏的测试人员,才会在下一个测试开始的初期就认真的对待它。笔者也算是吃过亏的人。因此在现在经手的测试工作中,总会提着测试数据这根弦。恰巧有同学问到这方面的问题,就分享一下个人的经验总结,与大家一起探讨。 在大话测试数据(一)文章中,我提到,获取数.
AutoTestTool3:android项目的自动测试工具
07-09
AutoTestTool3 auto test tool for android project 这是一个自动化测试金山词霸应用的工程. 后续尝试用到其他应用上.
Android自动测试之Monkey工具
java程序
04-06 347
                                                  Monkey工具 前言: 最近开始研究Android自动化测试方法,对其中的一些工具、方法和框架做了一些简单的整理,其中包括android测试框架、CTS、Monkey、Monkeyrunner、benchmark、其它test tool等等。因接触时间很短,很多地方有不足之处,希望能和...
mbr,gpt,smart,ata以及atapi的AutoTestToolC#
10-08
c#新手写的工厂厂测notebook程序第一版,用于读出分区信息以及各种监控信息.由本人测试通过。AHCI还在想办法中,后续会更新。记得用管理员权限运行哦。
Autotest:一款测试辅助工具
啊啊啊啊2
12-14 1827
许多人一直不解,在Ruby社区的开发者,为什么更喜欢类似于TextMate这样的文本编辑器,而非图形化的IDE工具?其中一个原因就是,在文本编辑器环境下,有大量Ruby编写的工具,可以帮助开发者完成繁琐的编码工作。最近,在Pat Eyler的blog中,对这些工具的特性进行了评比。 Autotest就是其中之一,它是Zentest包中的一个组件。其安装方式如下:\u0026#xD;\ngem in...
Apache-Flink
@xiao黑的博客
03-17 589
Apache-Flink 概述 Flink是构建在数据流之上地有状态计算地流计算框架 通常被人们理解为是第三代大数据分析方案 第一代-Hadoop的MapReduce(计算) Storm流计算(2014.9) 两套独立计算引擎 使用难度大 第二代-Spark RDD静态批处理(2014.2) DStream|Structured Streaming流计算 统一计算引擎 难度系数小 第三代-Fli...
GitHub中文排行榜,帮助你发现高分优秀中文项目(二)-Java
通往精英的成长之路
01-31 5494
榜单设立目的 ???????? GitHub中文排行榜,帮助你发现高分优秀中文项目; 各位开发者伙伴可以更高效地吸收国人的优秀经验、成果; 中文项目只能满足阶段性的需求,想要有进一步提升,还请多花时间学习高分神级英文项目; 榜单设立范围 设立1个总榜(所有语言项目汇总排名)、18个分榜(单个语言项目排名); 榜单入选规则 一个小小的要求:项目的 Description 和 README.md 都要包含中文说明; 更新越持续越好:最近半年内有更新过的项目才有机会入选(拥抱活跃,远离僵尸); Star
机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)
weixin_30263277的博客
07-07 2763
##机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)---#####注:机器学习资料[篇目一](https://github.com/ty4z2008/Qix/blob/master/dl.md)共500条,[篇目二](https://github.com/ty4z2008/Qix/blob/master/dl2.md)开始更新...
PyTorch-progressive_growing_of_gans-master.zip
04-07
标题中的"PyTorch-progressive_growing_of_gans-master.zip"指示了这是一个关于使用PyTorch实现渐进式生长生成对抗网络(Progressive Growing of GANs,简称PGGAN)的项目。PGGAN是一种改进的生成对抗网络(GAN)...
Region-growing-algorithm.zip_image region_region growing_segment
07-14
在标题“Region-growing-algorithm.zip_image region_region growing_segment”中,我们可以理解为这个压缩包包含的是关于区域生长算法在图像分割中的应用。"region growing"是区域生长算法的核心概念,而...
ERP系统信息化资料:SAP专业培训教材Growing-with-SAP_2.ppt
09-29
ERP系统信息化资料:SAP专业培训教材Growing-with-SAP_2.ppt
软件测试大作业-文达管理系统/Growing-Notes软件测试完整测试文档
05-25
重现步骤 1. 在手机端进入Growing_Notes网站。 2. 选择一个博客进行查看。 3. 滚动查看页面内容,发现部分内容被截断或省略。 备注 该缺陷可能影响用户对网站内容的完整性的认知,建议尽快修复。
Growing_Object-Oriented_Software,_Guided_By_Tests_(2009)
10-31
《Growing Object-Oriented Software, Guided by Tests (2009)》是一本探讨面向对象软件开发与测试驱动开发(TDD)紧密相连关系的英文书籍。它不仅深入探讨了面向对象设计(OOD)与测试驱动开发之间的相互作用,还...
python简明教程word版-计算机开放电子书归档 2018
weixin_39913648的博客
11-11 1048
97 Things Every Programmer Should KnowA Java Reference (UCB CS61b Textbook)AI Cheat SheetAdvanced RAn Introduction to Data ScienceAndroid Gradle 插件中文指南Android 安全笔记(JnuSimba)AngularJS学习笔记(checkcheckzz)...
计算机电子书 2018 BiliDrive 备份
热门推荐
龙哥盟
12-15 6万+
下载方式 根据你的操作系统下载不同的 BiliDrive 二进制。 执行: bilidrive download <link> 链接 文档 链接 Webpack 中文指南.epub (409.01 KB) bdrive://ce58b7b58292296a61a97de1f89c62b66da24ab6 OpenIntro Statistics 3e.pdf (...
Java ssm 面试题(2025最新版).docx
10-21
Java ssm 面试题(2025最新版)
【发文无忧】基于天鹰优化算法AO-Kmean-Transformer-GRU实现数据回归预测算法研究Matlab代码.rar
最新发布
10-21
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
region-growing
04-07
Region-growing is a computer vision and image processing technique used to segment an image into regions based on some predefined criteria. The technique works by starting with a seed point or a set ...
写文章

热门文章

  • 最火照片墙前端纯HTML(只需添加照片) 16580
  • 2022数学建模“五一杯”B题 题解+论文 14981
  • Web自动化测试-【Selenium环境部署Edge】 9246
  • 【C语言】C语言入门经典题目(范围广,内容多) 7956
  • 从键盘输入10个整数,存储到ArrayList集合中,然后遍历查找最大值输出结果。 6764

分类专栏

  • JavaEE 22篇
  • MySQL 4篇
  • Linux 3篇
  • 微服务 8篇
  • 刷题日记 22篇
  • Spring 13篇
  • Javaweb 13篇
  • Java SE 17篇
  • 练习笔记 2篇
  • C语言 29篇
  • 软件工程 2篇
  • 操作系统 3篇
  • JavaScript 4篇
  • 数值计算 1篇
  • 数据结构 23篇

最新评论

  • 2022数学建模“五一杯”B题 题解+论文

    2301_80196689: 那么只有8个数据的情况下是如何得到合格率的?

  • 最火照片墙前端纯HTML(只需添加照片)

    2301_81797495: 为什么我这样做图片显示不出来呀

  • 最火照片墙前端纯HTML(只需添加照片)

    x501435431: 如果照片展开后能自动绕z轴旋转就好了,我有旋转的照片墙的代码,就是还没尝试去加表情包

  • 最火照片墙前端纯HTML(只需添加照片)

    m0_75108120: 在DW里显示正常,进浏览器就只有一个图片

  • 最火照片墙前端纯HTML(只需添加照片)

    m0_75108120: 为什么就显示一个3D图片

最新文章

  • CAS问题汇总
  • SQL--查询结果最后加合计行
  • 技术架构演进之路-Docker【二】
2023年42篇
2022年116篇
2021年11篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙宇航_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家新密太湖石玻璃钢雕塑淄博玻璃钢雕塑公司玻璃钢孔子雕塑价格顺昌玻璃钢雕塑厂家范县玻璃钢雕塑设计2017商场圣诞美陈图片金华玻璃钢雕塑定做天津特色玻璃钢雕塑制作品牌玻璃钢人物雕塑销售方法聊城玻璃钢卡通雕塑电话公园景观玻璃钢卡通熊猫雕塑昆明抽象玻璃钢雕塑信阳玻璃钢商场美陈价格公园卡通玻璃钢雕塑施工玻璃钢雕塑设计哪里的好大型不锈钢雕塑玻璃钢雕塑做玻璃钢花盆咋样四川高质量玻璃钢雕塑方法扬州商场新春美陈文山市玻璃钢雕塑加工梅州楼盘景观雕塑玻璃钢供货商上美透明玻璃钢雕塑大型商场美陈怎么样保定玻璃钢孙悟空雕塑广州商场美陈供应商汕尾玻璃钢动物雕塑湖北百货商场美陈武汉广场玻璃钢人物雕塑公司和龙玻璃钢卡通雕塑营口玻璃钢景观雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化