10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#で自動テスト(Playwright) その2 もう少しテスト実用を考える

Last updated at Posted at 2024-05-18

前回

C#でPlaywrightを用いた自動テストについてまとめた。
今回は実用観点で見つつ、補足や周辺知識を確認する。
是非、ご指摘・ご助言いただきたい。

コード提案と結果の紹介

■テスト仕様書
Playwright for .NETの公式リファレンスページに関する結合テストケースを仮定する
 Videosのページが正常に開ける事を確認する
image.png

テストNo → メソッド名に合わせる
 Case1-1-1はCase1_1_1とするなど

操作 → ロケーターに対しアクション

期待する結果 → アサート処理
 期待値があいまいな場合は判断方法を考える。
 今回の例では: ページのタイトル/要素から判断/ページ上部の見出し等

※ログイン/ログアウトなどの処理は前提なのでテストケースの外に出したい
■ソース

Case1_1.cs
using System.Threading.Tasks;
using Microsoft.Playwright;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;
// キャプチャ取得処理を外に出したい
using tools;

namespace PlaywrightTests;

[Parallelizable(ParallelScope.Self)]
[TestFixture]
public class Case1_1 : PageTest
{
    // キャプチャ取得準備
    public Tool tool;

    // 動画を撮影したい場合
    public override BrowserNewContextOptions ContextOptions()
    {
        return new BrowserNewContextOptions()
        {
            // 出力先: デフォルトはbin\Debug\net8.0\
            // クラス名( Case1_1 )でエビデンスをまとめる
            RecordVideoDir = "../../../output/videos/" + GetType().Name + "/",
        };
    }

    // 各Test注釈に対し毎回事前処理
    [SetUp]
    public async Task Init()
    {
        // ログイン処理
    }

    // 各Test注釈に対し毎回事後処理
    [TearDown]
    public async Task Clean()
    {
        // ログアウト処理
    }
    
    [Test]
    public async Task Case1_1_1()
    {
        // 指定URL先で,サイドメニュー(初期画面外)のVideosを押下する
        await Page.GotoAsync("https://playwright.dev/dotnet/docs/intro");
        await Page.GetByText("Videos").ClickAsync();

        // テスト結果判定: ページのTitleを確認する
        await Expect(Page).ToHaveTitleAsync("Videos | Playwright .NET");

        // テストケース名でキャプチャ取得
        tool = new Tool();
        await tool.getCapture(Page, GetType().Name);
    }
}
Tools\tool.cs
using Microsoft.Playwright;
namespace tools;
public class Tool
{
    public async Task getCapture(IPage page, string name)
    {
        await page.ScreenshotAsync(new()
        {
            Path = "../../../output/captures/"
        });
    }
}

■実行するためのバッチ

rem テストを実行: ログ出力(追記)
rem デバッグ実行用の処理をON/OFF
rem set PWDEBUG=1
dotnet test -- Playwright.LaunchOptions.Headless=false >> output\.log

■実行結果
結果:OKの例
image.png
結果:NGの例
image.png
デフォルトで5秒待機、9回?試行してくれる

補足など

キャプチャ取得(画面ハードコピー)

そうじゃない.cs
await Page.ScreenshotAsync(new(){Path = "screenshot.png",});

上記を元にもうちょっと使いやすくした

動画撮影

[Test]単位でファイル出力される
ファイル名は指定できない → 実行後にケースNo.との紐づけができない

レポート作成

for .NETは非対応。ついでに画像比較も。
エビデンスとして、簡単なbatを作るのはありかもしれない

findstr -n "失敗" output\.log > output\report.txt

※文字コード変換でハマるので簡単の為以下の運用
 実行.batとは別に作成する
 実行.bat叩いた後 ログの文字コードをShift-JISに変換し、レポート.batを実行
 課題: 実行で都度文字コードがUTF-8に戻る/工数

■レポートのイメージ
↓ 全体サマリとNGメソッド名を出力する
10: 失敗 Case1_1_1 [9 s]
34: 失敗 Case1_1_2 [10 s]
70:失敗! -失敗: 1、合格: 1、スキップ: 0、合計: 2、期間: 19 s - playwright_test.dll (net8.0)

メソッド名からNGケースを特定
行数を元にログファイルからNG原因を特定

レポート作成 その2

Playwright for .NETは非対応...とはいえ、NUnitの方で対応できたのでご紹介。

dotnet test --logger "html;logfilename=testResult.html" > output\sample2.log

image.png

ブラウザの指定

// firefox
dotnet test -- Playwright.BrowserName=firefox

// Edge
dotnet test -- Playwright.BrowserName=chromium Playwright.LaunchOptions.Channel=msedge 

// Chrome
dotnet test -- Playwright.BrowserName=chromium Playwright.LaunchOptions.Channel=chrome

// Chromeでかつ表示したい場合
dotnet test -- Playwright.BrowserName=chromium Playwright.LaunchOptions.Channel=chrome Playwright.LaunchOptions.Headless=false >> output\.log

テスト再試行

[Test, Retry(2)]の様な記載にする

NUnit属性

後書き

エビデンスの充実を理由にPlaywrightを選定したのに...
この辺をもっとしっかりするやり方ないでしょうか。。
動画: 名前めちゃめちゃ...せめてと思いフォルダ分け済み
【解決済み】スクショ: 1行にまとまらない
【解決済み】レポート: 非対応ですって!?

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?