業務で使用したC#の便利ライブラリ

#はじめに
自分のモチベーションアップも含め、Qiitaに何か投稿をしようと考えて半年が経ってしまいました。
今回のアドベントカレンダーを機に投稿していこうと思った次第です。

あまりにも知られているライブラリであるため、お役に立てなかったらすいません。
たくさん紹介したいものもありますが、今回私が紹介したいものは下記となります。

- Selenium
- ExcelDataReader

※SEO対策のテストや、SIer時代のテスト項目消化などに使用していました。
# Selenium
昔からあるクライアントチェックライブラリの一つですが、改めて紹介をさせていただきます。

dotnetコマンドからプロジェクトを作っていきましょう。
※dotnet SDKに関しては[Download .NET (Linux, macOS, and Windows)](https://dotnet.microsoft.com/download)からダウンロードをお願いします。

```
dotnet new nunit -o SeleniumUITest
```

実行すると下記のようなcsファイルができるかと思います。

```C#:UnitTest1.cs
    public class Tests
    {
        [SetUp]
        public void Setup()
        {
        }

        [Test]
        public void Test1()
        {
            Assert.Pass();
        }
    }
```

次に、プロジェクトにSeleniumを追加していきましょう。

```
dotnet add package Selenium.WebDriver
dotnet add package Selenium.WebDriver.ChromeDriver
```
ここから簡単にコードを追記していきます。

```C#:UnitTest1.cs
    public class Tests
    {
        private OpenQA.Selenium.IWebDriver webDriver = null;
        [SetUp]
        public void Setup()
        {
            var options = new ChromeOptions();
            // ２つのオプションを追加
            // 1つ目ブラウザを立ち上げない
            // 2つ目プライベートモードで開く
            options.AddArguments("--headless", "--incognito");
            webDriver = new OpenQA.Selenium.Chrome.ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), options);
        }

        [Category("Assert True Test")]
        [TestCase("https://qiita.com/nariakiraHara/items/f1b4d091ed447a283d8d", "title", "業務で使用したC#の便利ライブラリ - Qiita")]
        public void Test1(string url, string tagName, string content)
        {
            AssertTrueTest(url, tagName, content);
        }

        private void AssertTrueTest(string url, string tagName, string content)
        {
            webDriver.Navigate().GoToUrl(url);
            var titleInfo = webDriver.Title;
            Assert.AreEqual(content,  titleInfo, "タイトルを間違えています。");
        }

        [OneTimeTearDown]
        public void Dispose()
        {
            if(webDriver != null)
            {
                webDriver.Quit();
                webDriver.Dispose();
            }
        }
    }
```

テスト内容としては、渡されたTestCaseのUrl, tag名, コンテンツを渡します。
SeleniumからUrlにアクセスし、タグの内容と想定される結果が正しいかを検証します。
◎実際のクライアントからテストできるため便利かと

# ExcelDataReader
エクセルのデータを読み込むことができるライブラリとなります。
テスト項目を作成後、読み込ませ想定される結果が合っているかを、上記Seleniumを使用して確認したりしてました。

プロジェクトを作成していきます。

``` 
dotnet new console -o ExcelReadSample
```

ライブラリーを入れていきます。


```
dotnet add package ExcelDataReader
dotnet add package ExcelDataReader.DataSet
dotnet add package System.Text.Encoding.CodePages
```

今回はサンプルとして下のようなExcelを作成し、Console出力してみたいと思います。
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292532/ba24c124-39fb-a330-128a-f1e2f9987e3f.png)



プロジェクトに"resources"フォルダを追加し、Excelを格納します。
こんな感じになりました。

```C#:Program.cs
    class Program
    {
        // 先程の画像のExcel Data.xlsxを読み込む
        private static readonly string DATA_PATH = @"resources/Data.xlsx";
        static void Main(string[] args)
        {
            Console.WriteLine("Start Excel Read");
            var app = new Program();
            app.Run();
            Console.WriteLine("End Excel Read");
        }

        public void Run()
        {
            var ds = ReadData(DATA_PATH);

            foreach(DataTable tbl in ds.Tables) {
                Console.WriteLine($"シート名 {tbl.TableName}");
                // 1行ずつ見ていく
                for(var j = 0; j < tbl.Rows.Count; j++) {
                    if (j == 0) continue;
                    // 1カラムずつ見ていきます
                    for(var i=0; i<tbl.Columns.Count; i++) {
                        Console.Write($"{tbl.Rows[j][i]} ");
                    }
                    Console.WriteLine("");
                }
            }

        }

        private DataSet ReadData(string path)
        {
            DataSet ds = null;
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            try {
                // ファイルパスからExcelを読み込む
                using(var stream = File.Open(path, FileMode.Open, FileAccess.Read)) {
                    using(var reader = ExcelReaderFactory.CreateReader(stream)) {
                        ds = reader.AsDataSet();
                    }
                }
            }
            catch(Exception ex) {
                Console.Error.WriteLine(ex.Message);
            }

            return ds;
        }

    }
```

出力結果

```
Start Excel Read
シート名 Sheet1
1 https://qiita.com/ title Qiitaだよ 
2 https://qiita.com/ h1 はじめに 
3 https://qiita.com/ h1 僕はトムではありません 
4 https://qiita.com/ title はは 
End Excel Read
```

こんな感じの出力結果になります。
Excelをテストケースのように作成し、テストをSeleniumを使用してテストを実施していました。

よかったら参考にしてみてください^^