自動テストのための Selenium と Junit の詳細な説明

Google Chrome をバージョン 111 にアップグレードすると、Java バージョンの Selenium は Chrome と互換性がなくなります

なのでブラウザとドライバを入れ替えて、edgeブラウザとedgeドライバを使ってください、この記事はchromeブラウザのバージョン111より前に書いたので、

ChromeDriver driver = new ChromeDriver(); driver オブジェクトを作成する操作を見た後、このコードを

EdgeOptions options = new EdgeOptions();
options.addArguments("-remote-allow-origins=*");
EdgeDriver driver = new EdgeDriver(options)
  • EdgeOptionsEdge ブラウザーのオプションを設定するために使用されるクラスです。
  • options.addArguments("-remote-allow-origins=*")クロスドメイン要求を許可するように Edge ブラウザを設定するオプションです。つまり、WebDriver とブラウザが異なるドメイン間で通信できるようにします。
  • EdgeOptions オブジェクトを使用して設定しない限り、これを行う方法はありません。ChromeDriver には同様のオプションを設定する必要がないため、直接 ChromeDriver driver = new ChromeDriver() を使用してドライバー オブジェクトを作成できますが、バージョンに互換性がないため、chrome は必要ありません。

1. 自動化とは

役割: テストの品質と効率を向上させながら、人間の入力を効果的に削減するための自動化されたテストを通じて

概念: 自動テストとは、ソフトウェア テストの自動化、正常および異常な状態を含む事前設定された状態でのアプリケーションまたはシステムの実行、および実行結果の最終的な評価の自動化を指します。人間主導のテスト動作を機械が実行するプロセスに変換

たとえば、リグレッション テストのバージョンがますます多くなり、バージョン リグレッションの圧力が高まっています.手動テストだけですべてのバージョンを返すことは現実的ではないため、自動テストを使用する必要があります.

2. 自動テストの分類

  1. インターフェイス自動テスト
  2. UI自動化テスト(インターフェーステスト)
  3. モバイル自動テスト
  4. Web 側の自動テスト

3. selenium (Web 自動化テスト ツール)

(1) Web 自動化テスト ツールとして Selenium を選択する理由は次のとおりです。

  1. オープンソース無料
  2. Chrome、Firefox、IE ブラウザなど、複数のブラウザをサポートしています...
  3. Linux、Windows、MacO などの複数のシステムをサポート
  4. Java、Python、JavaScript などの複数の言語をサポート...
  5. Selenium パッケージは、テスト用の多くの API を提供します

(2) 環境展開

Selenium を使用して Web 自動化テストを実装する場合、必要な環境は何ですか?

Chrome ブラウザー、Google ドライブ (ChromeDriver)、Selenium ツールキット

(3) ドライバーとは?

手動テストの場合、人々がブラウザを手動で開きに来て、ドライバーは人間です

自動化のために、コードはブラウザーを直接開くことができません。ブラウザーを開くにはドライバーが必要です。

selenium によって記述された自動化スクリプトはどのようにブラウザーを開きますか (selenium Driver ブラウザーと 3 つの関係)

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-a7xMlbPA-1681625932504) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\ 1673750214137.png)]

ドライバーは、selenium スクリプトによって送信された http 要求を受け入れて解析する必要があります。

4. 簡単な自動化の例

Maven プロジェクトを作成し、selenium パッケージをインポートする

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.0.0</version>
    </dependency>
</dependencies>

簡単な自動化の例は、主に 5 つのステップで構成されています

  1. ドライバー インスタンスの作成、セッションの作成 (ChromeDriver オブジェクトのインスタンス化)
  2. visitsite(object.get("ウェブサイト"))
  3. 要素を検索 (object.findElement(By.cssSelector("#url 要素 id")).sendKeys("入力内容"))
  4. アクション要素 (object.findElement(By.cssSelector("#URL 要素 id")).click())
  5. セッションを終了します (object.quit())
package com.autotest0113;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.List;

public class FirstAutotest {
    
    
    // 在百度网址搜索关键词 “胡歌”
    public void huge() throws InterruptedException {
    
    
        // 1.打开浏览器
        ChromeDriver chromeDriver = new ChromeDriver();
        Thread.sleep(3000);
        // 2.在浏览器里输入百度网址,访问百度首页
        chromeDriver.get("https://www.baidu.com");
        Thread.sleep(3000);
        // 3.找到百度首页输入框元素,并输入关键词 “胡歌”
        chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("胡歌");
        Thread.sleep(3000);
        // 4.找到百度首页 “百度一下” 按钮,并点击一下
        chromeDriver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        // 5.结束会话(关闭浏览器)
        chromeDriver.quit();
    }
}
package com.autotest0113;

import sun.text.normalizer.CharTrie;

public class RunAutoTest {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        FirstAutotest firstAutotest = new FirstAutotest();
        firstAutotest.huge();
    }
}

5.セレンの一般的な方法

5.1 ページ要素の検索 findElement ()

パラメータ: クラス別 (要素の検索方法を提供)

戻り値: webElemen

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-3CMF6yKn-1681625784105) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\ 1673751728162.png)]

ページで要素が見つかると、プログラムは正常に終了します。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-fxMItxKL-1681625784106) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\ 1673751423117.png)]

ページで要素が見つからない場合、プログラムはエラーを実行します

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-AJYyQUEW-1681625784106) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\ 1673751541380.png)]

findElements() メソッド

パラメータ: クラス別 (要素の検索方法を提供)

戻り値:リスト

public void methodTest() {
    
    
    ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    driver.findElement(By.cssSelector("#kw"));
    List<WebElement> elements= driver.findElements(By.className("hotsearch-item"));
    for (WebElement element : elements) {
    
    
        System.out.println(element.getText());
    }

    driver.findElement(By.cssSelector("#su"));
    driver.quit();
}

5.2 クラス別要素の配置

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-pO6Lng9k-1681625784108) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1673752409013.png)]

5.3 xpath パス言語

文法:

階層: /sublevel// スキップ レベル

属性:@

関数: contains()...

自動化では、要素の配置は一意である必要がありますが、セレクターまたはパス要素をページに手動でコピーすることは必ずしも一意ではなく、一意になるように手動で変更する必要があります

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-q6meK5YM-1681625784109) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1673753096032.png)]

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-B4LcN68A-1681625784110) (C:\Users\28463\AppData\Roaming\Typora\) Typora-user-images\ 1673753516762.png)]

6. 共通要素操作

6.1 入力テキスト sendKeys

sendKeys、編集可能なコンテンツを持つテキスト フィールドと要素のみ

 // 找到百度搜索框
 WebElement ele = driver.findElement(By.cssSelector("#kw"));
// 在输入框输入文本
ele.sendKeys("qq音乐");

// 找到百度搜索框并输入文本
// driver.findElement(By.cssSelector("#kw")).sendKeys("qq音乐");

6.2 クリック クリック

// 3.找到百度搜索框并输入文本
driver.findElement(By.cssSelector("#kw")).sendKeys("qq音乐");

6.3 Submit submit (Enterキーで送信)

送信はフォーム要素にのみ適用され、セレンは公式には送信を推奨しておらず、クリックがより推奨されています

// 找到百度搜索框并输入文本
driver.findElement(By.cssSelector("#kw")).sendKeys("qq音乐");
// 找到百度一下通过回车键进行提交
driver.findElement(By.cssSelector("#su")).submit();

6.4 リクエストクリア

clear: 入力が繰り返されるかどうかを頻繁にテストするのに適しています

// 清除输入框的内容
driver.findElement(By.cssSelector("#kw")).clear();

6.5 テキストを取得する getText

// 获取文本
String text = driver.findElement(By.cssSelector("#s-top-left > div > a")).getText();
System.out.println("获取到的文本:" + text);

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-5VrcD6yu-1681625784110) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1675913113054.png)]

6.6 属性 getAttribute に対応する値を取得する

// 获取属性的值
String buttonText = driver.findElement(By.cssSelector("#su")).getAttribute("type");
System.out.println("获取到的属性名:" + buttonText);
String buttonText1 = driver.findElement(By.cssSelector("#su")).getAttribute("id");
System.out.println("获取到的属性名:" + buttonText1);
String buttonText2 = driver.findElement(By.cssSelector("#su")).getAttribute("value");
System.out.println("获取到的属性名:" + buttonText2);

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-7234Ct0O-1681625784111) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1675913097007.png)]

6.7 ページのタイトルと URL を取得する

System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());
driver.findElement(By.cssSelector("#kw")).sendKeys("你好");
driver.findElement(By.cssSelector("#su")).click();
System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-aYOQ59T5-1681625784112) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1677659438770.png)]

7.窓

7.1 ウィンドウサイズの設定 (manage().window())

最大化、最小化、フルスクリーン ウィンドウ、手動でウィンドウ サイズを設定

public void windowConTrol() throws InterruptedException {
    
    
    Thread.sleep(3000);
    // 窗口最大化
    driver.manage().window().maximize();
    Thread.sleep(3000);
    // 窗口最小化
    driver.manage().window().minimize();
    Thread.sleep(3000);
    // 全屏
    driver.manage().window().fullscreen();
    Thread.sleep(3000);
    // 手动设置窗口大小
    driver.manage().window().setSize(new Dimension(1024,768));
    Thread.sleep(2000);
    
    driver.quit();
}

7.2 ウィンドウの切り替え

Baidu のホームページを開き、画像のハイパーリンクをクリックして Baidu の画像のホームページに入り、Baidu の画像ページで [Baidu click] ボタンを取得します。

	public void windowConTrol() throws InterruptedException, IOException {
    
     
		// 窗口切换
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#homeSearchForm > span.s_btn_wr > input"));
        driver.quit();
	}

結果はエラーで、ページ要素が見つかりません

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンクのメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-mAX8YaqV-1681625784112) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1675931056472.png)]

これは、ブラウザーがタブを開くたびに、ハンドルと呼ばれる各タブを自動的に識別するためです。

getWindowHandles() ですべてのタブ ページのハンドル Set を取得し、getWindowHandle() で現在のページのハンドルを取得してから、すべてのタブ ページのハンドルをたどることができます。現在のページのハンドルがトラバーサル Set のハンドル、ウィンドウ切り替え用の switchTo( ).window() メソッドを渡す

    public void windowConTrol() throws InterruptedException, IOException {
    
    
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
        Thread.sleep(3000);
        // 获取当前页面的句柄
        String curHandle = driver.getWindowHandle();
        System.out.println("当前页面的句柄:" + curHandle);
        // 获取所有标签的句柄
        Set<String> handles =  driver.getWindowHandles();
        for (String handle : handles) {
    
    
            if(handle != curHandle) {
    
    
                driver.switchTo().window(handle);
            }
        }
        driver.findElement(By.cssSelector("#homeSearchForm > span.s_btn_wr > input"));
        Thread.sleep(3000);
        driver.quit();
    }

では、複数のウィンドウを開いている場合、どのように切り替えるのでしょうか?

自動化では基本的にそのようなシナリオはありませんので、ここで深く考える必要はありません

8. スクリーンショット getScreenshotAs

ここで、pom.xml のスクリーンショット ファイルに必要なパッケージを導入する必要があります。

    <!-- 保存屏幕截图文件需要用到的包-->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

1 つ注意すべきことは、結果ページの要素を見つけるためにコードが実行されるとき、ページが完全にロードされていないことです.このとき、プログラムの実行速度はページのレンダリング速度よりも速いため、待機を追加することに注意してください.最初にページをレンダリングしてから、スクリーンショットを撮ります

    public void windowConTrol() throws InterruptedException, IOException {
    
    
        // 屏幕截图
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("网易云音乐");
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        // 屏幕截图(保存现场)
        File srcfile = driver.getScreenshotAs(OutputType.FILE);
        // 把屏幕截图好的文件放到指定的路径下
        String filename = "my.png";
        FileUtils.copyFile(srcfile,new File(filename));
        driver.findElement(By.cssSelector("#content_left"));
        driver.quit();
    }

ここでの私のコード ファイルの名前は固定形式です. プログラムによって生成されたイメージ ファイルが複数回実行されると、同じ名前で上書きされます. これにより、ファイル名に動的データ (タイム スタンプ) が追加されます.

9.待つ

プログラムの実行速度は、ブラウザのレンダリング速度よりもはるかに高速です

4 種類の待機:強制待機、暗黙待機、明示待機、スムーズ待機

注: 明示的待機と暗黙的待機を同時に使用することはできません。同時に使用すると、予期しない待機結果が発生する可能性があります。

9.1 強制待機

8. スクリーンショットを撮るときは、スクリーンショットを撮る前にページが完全にレンダリングされるように、途中で 3 秒待ちます (Thread.sleep())

これにより、プログラムが. この方法は自動テストで使用されますが、あまり使用されていません.

各自動化メソッドは自動化されたテスト ケースです. たとえば、1 つのテスト ケースには 10 秒、100 のテスト ケースには 1000 秒、200 のテスト ケースには 2000 秒かかります。

9.2 暗黙の待機

暗黙の待機は、ドライバーのライフサイクル全体に作用します

暗黙の待機は、要素が存在するかどうかを判断するためにポーリングを続けます。存在しない場合は、要素が見つかるまで、設定された時間待機してポーリングを続けます。

public class autoTest {
    
    
    ChromeDriver driver = new ChromeDriver();
    public void waitContro() {
    
    
        // 添加隐式等待
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        driver.findElement(By.cssSelector("#su")).click();
        driver.findElement(By.cssSelector("#content_left"));
        driver.quit();
    }
}

9.3 ショーウェイティング

public class autoTest {
    
    

    ChromeDriver driver = new ChromeDriver();
    public void webDriverWait() {
    
    
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        driver.findElement(By.cssSelector("#su")).click();
        // 添加显示等待
        new WebDriverWait(driver,Duration.ofSeconds(5)).until(driver->driver.findElement(By.cssSelector("#content_left")));
        driver.quit();
    }
}

10. ブラウザ ナビゲーション ナビゲート

ブラウザ進む(進む)、戻る(戻る)、更新(リフレッシュ)

public class autoTest {
    
    
    ChromeDriver driver = new ChromeDriver();
    // 浏览器导航
    public void navigateConTrol() {
    
    
        driver.get("https://www.baidu.com");
//        driver.navigate().to("https://www.baidu.com");
        // 想要回退到访问百度网址之前的状态
        driver.navigate().back();
        // 前进 进入到百度首页
        driver.navigate().forward();
        // 刷新百度首页
        driver.navigate().refresh();
        driver.quit();
    }
}

11.ポップアップウィンドウ

ポップアップの種類: 警告ポップアップ、確認ポップアップ、プロンプト ポップアップ

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-SnxcZflR-1681625784113) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1677663831186.png)]

ポップアップを処理する手順:

  1. ドライバ オブジェクトをポップアップ ウィンドウに適用する (ポップアップ ウィンドウに切り替える) driver.switchTo.alert()
  2. accept() / cancel() を確認するために選択します (プロンプト ポップアップ ウィンドウ 入力テキスト sendkeys はページ上の入力テキストの実行効果を確認できません)

警告ポップアップには確認ボタンしかありませんが、承認と却下の両方を処理できます

警告ポップアップ ウィンドウにも確認ポップアップ ウィンドウにもテキストを入力する場所はありませんが、alert.sendKeys コードを実行する場合、エラーは報告されません。

ChromeDriver chromeDriver = new ChromeDriver();
// 提示弹窗
void Alertcontro() throws InterruptedException {
    
    
    chromeDriver.get("file:///D:/%E6%8F%90%E7%A4%BA%E5%BC%B9%E7%AA%97.html");
    Thread.sleep(3000);
    // 打开弹窗
    chromeDriver.findElement(By.cssSelector("body > input[type=button]")).click();
    Thread.sleep(3000);
    // 切换到弹窗进行弹窗处理
    Alert alert = chromeDriver.switchTo().alert();
    Thread.sleep(3000);
    // 1. 输入
    alert.sendKeys("666");
    Thread.sleep(3000);
    // 2. 点击确认
    alert.accept();
    Thread.sleep(3000);
    // 取消
    alert.dismiss();
    chromeDriver.quit();
}

12. 選択ボックスの選択

オプションの選択方法: テキストによる選択 (selectByVisibleText)、属性値による選択 (selectByValue)、シリアル番号による選択 (selectByIndex)

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-PLExhyww-1681625784115) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1677666804934.png)]

ChromeDriver chromeDriver = new ChromeDriver(); 
void selectControll() throws InterruptedException {
    
    
        chromeDriver.get("file:///D:/%E9%80%89%E6%8B%A9%E6%A1%86.html");
        WebElement ele = chromeDriver.findElement(By.cssSelector("#ShippingMethod"));
        Thread.sleep(2000);
        // 先创建选择框对象
        Select select = new Select(ele);
        Thread.sleep(2000);
        // 根据文本来选择
//        select.selectByVisibleText("333");
        // 根据属性值选择
//        select.selectByValue("222");
        // 根据序号选择【序号从 0 开始】
        select.selectByIndex(3);
        Thread.sleep(2000);
        chromeDriver.quit();
    }

13. スクリプト executeScript を実行します。

executeScript (パラメーター: JS)

ChromeDriver chromeDriver = new ChromeDriver();
void scriptControll() throws InterruptedException {
    
    
    chromeDriver.get("https://image.baidu.com/");
    Thread.sleep(3000);
    // 执行 JS 命令:让页面置顶/置底
    chromeDriver.executeScript("document.documentElement.scrollTop=500");
    Thread.sleep(3000);
    chromeDriver.executeScript("document.documentElement.scrollTop=0");
    Thread.sleep(3000);
    chromeDriver.quit();
}

// 也可以通过 JS 代码来操作在输入框中搜索
void scriptControll() throws InterruptedException {
    
    
     chromeDriver.get("https://www.baidu.com");
     // 找到百度搜索框,输入 “迪丽热巴”
     chromeDriver.executeScript("var ss = document.querySelector(\"#kw\");ss.value = '迪丽热巴';");
     Thread.sleep(3000);
     chromeDriver.quit();
}

14. ファイルのアップロード

ChromeDriver driver = new ChromeDriver();
// 文件上传
void fileUploadControll() throws InterruptedException {
    
    
    driver.get("file:///D:/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0.html");
    driver.findElement(By.cssSelector("#avatar")).sendKeys("D:\\微信图片_20230212212832.jpg");
    Thread.sleep(3000);
    driver.quit();
}

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-KiaCGl5m-1681625784115) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1677810737509.png)]

15. ブラウザのパラメータ設定 ChromeOptions

ヘッドレス モード: 実際の作業では、テスターは自動実行のためにマシンに自動化を展開します.テスターはテスト プロセスを見ることはできませんが、自動実行の結果を直接見ることができます.

ヘッド モード: プログラムは自動的にテストされ、テストを実行するプロセス インターフェイスを確認できます。

ブラウザ オブジェクトを作成する前に、ブラウザのパラメータを設定する必要があります。

void paramsControll() {
    
    
    // 先创建选项对象,然后再设置浏览器参数
    ChromeOptions options = new ChromeOptions();
    options.addArguments("-headless");
    // 百度搜索迪丽热巴
    ChromeDriver driver = new ChromeDriver(options);
    driver.get("https://www.baidu.com");
    driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
    driver.findElement(By.cssSelector("#su")).click();
    driver.quit();
}

16. ユニットテストツール Junit

自動化はseleniumスクリプトで実現しており、junitはJavaの単体テストツールですが、自動化を実装する際にはjunitライブラリ(junit5)で提供されているアノテーションをいくつか借りる必要があります

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>

@Test (テスト メソッド)、@BeforeEach (各テスト ケースの前に 1 回実行)、@BeforeAll (すべてのテスト ケースの前に 1 回実行)、@AfterEach (各テスト ケースの後に 1 回実行)、@AfterAll (すべてのテスト ケースの後に 1 回実行) )

また、BeforeAll および AfterAll のアノテーションが付けられたメソッドは、静的メソッドでなければなりません

(1) 注意事項

アノテーション機能はjunitで提供されています

@Test は、メソッドがテスト メソッドであることを示します。現在のクラスが実行されると、このクラスの @Test アノテーションが付けられたすべてのユース ケースが自動的に実行されます。

public class junitTest {
    
    
    @Test
    void bbb() {
    
     System.out.println("bbbb");}
    @Test
    void ccc() {
    
     System.out.println("cccc");}
}

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-FKPKNljW-1681625784116) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\ 1676107787749.png)]

@BeforeEach は、各ユースケースを実行する前に現在のメソッドを実行する必要があることを示します

public class junitTest {
    
    
    @BeforeEach
    void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-75ZNi6mX-1681625784117) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1676107758523.png)]

@BeforeAll 現在のメソッドは、現在のクラスのすべてのユースケースの前に実行する必要があり、このアノテーションによって変更されるメソッドは静的メソッドでなければなりません

public class junitTest {
    
    
    @BeforeAll
    static void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-aPcLVZDd-1681625784117) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1676107976344.png)]

@AfterEach は、各ユース ケースの実行後に 1 回実行されます

public class junitTest {
    
    
    @AfterEach
    void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-7tOrgOg1-1681625784118) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1676108056007.png)]

@結局

public class junitTest {
    
    
    @AfterAll
    static void aaa() {
    
    System.out.println("aaaa");}
    
    @Test
    void bbb() {
    
    System.out.println("bbbb");}

    @Test
    void ccc() {
    
    System.out.println("cccc");}
}

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-7AmenVlV-1681625784120) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1676108097252.png)]

16.1 Junitの実行順序

2 つのコードの実行順序に注意してください

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-34ugmF0R-1681625784121) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1677814648215.png)]

テスト ケースの実行は、テスト ケースを記述した順序で実行されないことがわかります。そのため、いくつかの問題が発生します。

たとえば、ブログのログイン システムのテスト ケースを作成すると、次のユース ケースが含まれます。

  1. ログインページが正しく表示されていることを確認する
  2. 通常ログイン確認(ブログホームページ・一覧ページへジャンプ)
  3. 異常ログイン

実行順序の問題により、たとえば、最初にステップ 2 を実行し、この時点でログインが成功し、ページがジャンプし、ステップ 1 の実行後にエラーが報告されるなどの原因が考えられます。

1. 注文アノテーションによるソート

  • 最初にアノテーションを使用して、現在のクラスのすべてのユースケースで順序アノテーションを使用してソートする必要があること、およびアノテーションをクラスで使用する必要があることを説明します
  • 次に、 Order を使用して特定の実行順序を指定します

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-dnAd5Ler-1681625784121) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1678190744599.png)]

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    
    
    @Test
    @Order(1)
    void ediloginTest() {
    
    
        System.out.println("loginTest");
    }

    @Test
    @Order(2)
    void AindexTest() {
    
    
        System.out.println("indexTest");
    }
    
    @Test
    @Order(3)
    void editTest() {
    
    
        System.out.println("editTest");
    }
}

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-NqwWttF1-1681625784122) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1678190295598.png)]

16.2 パラメータ化

1 つのユース ケースと複数のパラメーター セットで可能な限りユーザーの行動をシミュレートする

単一パラメータ:

@ParameterzedTest + @ValueSource(datatype method/plus s = {parameter1,parameter2,parameter3,...})

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Vk7D0aFe-1681625784123) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1678191635490.png)]

複数のパラメータ:

@parameterizedTest + @CsvSource({"", "", '", ...})各二重引用符は一連のテスト ケースです

@ParameterizedTest
@CsvSource({
    
    "张三,22","李四,25","王五,35"})
void muchParamsTest(String name,int age) {
    
    
    System.out.println("name: " + name + ",age: " + age);
}

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-mc6tOC6D-1681625784123) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1678192053809.png)]

マルチパラメータ (サードパーティの csv ファイルからデータ ソースを読み取る)

@ParameterizedTest + @CsvFileSource(files = "ファイルパス + 名前")

ここでの csv ファイルは、サフィックスを直接変更して生成するのではなく、システムに付属の Excel ツールを使用して csv ファイルを開いて編集します。

@ParameterizedTest
@CsvFileSource(files = "D:\\mycsv.csv")
void csvfileParamsTest(String name, int age) {
    
    
    System.out.println("name: " + name + ",age: " + age);
}

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-NHpxTQgn-1681625784123) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1678193821094.png)]

driver.navigate().back();

これはブラウザの戻るボタンをシミュレートし、現在のページを前のページに戻します。この方法はテストで使用できます。たとえば、前のページに戻って特定の操作を再実行したり、テスト プロセス中に特定の情報を確認したりする必要があります。

動的パラメータ メソッド

// 通过动态方法来提供数据源
@ParameterizedTest
@MethodSource("methodParams")
void dynamicMethodParamsTest(String name,int age) {
    
    
    System.out.println("name: " + name + ",age: " + age);
}
static Stream<Arguments> methodParams() throws InterruptedException {
    
    
    // 构造动态参数
    String[] arr = new String[5];
    for (int i = 0; i < arr.length; i++) {
    
    
        Thread.sleep(500);
        arr[i] = System.currentTimeMillis() + "";
    }
    return Stream.of(
            Arguments.arguments(arr[0],20),
            Arguments.arguments(arr[1],20),
            Arguments.arguments(arr[2],20),
            Arguments.arguments(arr[3],20),
            Arguments.arguments(arr[4],20)
    );
}

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-A4Iv1Jnb-1681625784124) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1678195006408.png)]

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-QshfXEiA-1681625784125) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\ 1678195189267.png)]

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-IWoyEzkI-1681625784125) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1678195447837.png)]

16.3 テストスイート

3 つのクラスを作成し、各クラスにテスト アノテーション @Test を追加します。テストして実行する場合は、一度に 1 つのクラスしか実行できず、同時に 3 つのクラスを実行することはできません。

したがって、テスト スイートを使用して複数のテスト クラスを同時に実行できます。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ot48ktbx-1681625784126) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1678195913441.png)]

クラスを作成し、 @Suite アノテーションを介して (テスト クラスではなく) テスト スイート クラスとして識別します。

  1. ユース ケースを実行するクラスを指定します (パラメーター化されたユース ケースを除き、実行するユース ケースには @Test のアノテーションを付ける必要があります)。
/**
 * @Description: 测试套件
 * @Date 2023/3/7 21:29
 */
@Suite
@SelectClasses({
    
    aaa.class,bbb.class,ccc.class})
public class runSuite {
    
    
}

プログラムを実行して確認する

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-03cQdssN-1681625784126) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1678196064853.png)]

  1. 実行するパッケージ名を指定します(最初の方法、クラスが多すぎる場合は適切ではありません。パッケージを指定できます)

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-g1lLvtDL-1681625784127) (C:\Users\28463\AppData\Roaming\Typora\ Typora-user-images\1678196566092.png)]

@Suite
@SelectPackages("com.autoTest0303")
public class runSuite {
    
    
}

17. 断言 Assertions

アサーションは assertEquals に一致しますが、アサーションは assertNotEquals に一致しません

@Test
void huixiang() {
    
    
    ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");//百度一下
    // 假如这里获取的属性不是百度一下,而是百度两下
    System.out.println(text);
    Assertions.assertEquals("百度两下",text);
    driver.quit();
}

[外部リンクの画像転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-gYTafCz7-1681625784140) (C:\Users\28463\AppData\Roaming\Typora \typora-user-images\ 1676108848359.png)]

アサーション結果は true assertTrue で、アサーション結果は false assertFalse

@Test
void ddd() {
    
    
    Assertions.assertTrue(1==1);//正确
}
@Test
void eee() {
    
    
    Assertions.assertFalse(1==1);//报错
}
@Test
void fff() {
    
    
    Assertions.assertFalse(1==0);//正确
}

アサーション構造が空 assertNull、アサーション結果が空でない assertNotNull

@Test
void ggg() {
    
    
    String aaa = null;
    Assertions.assertNull(aaa);//通过
}
@Test
void hhh() {
    
    
    Assertions.assertNotNull("你好");//通过
}

おすすめ

転載: blog.csdn.net/m0_58761900/article/details/130182123