- 開発技術
【C#】自動テストの実装(MsTest)
- その他
自動テストとは
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
人の目でプログラムの実行結果を見て、多数のテストケース毎にテストする「手動テスト」とは違い、
テスト用モジュールを用いて、テストを行う手法です。
自動テストでは、一度作ったテストケースを繰り返し実行、再利用することできるため、
デグレード防止や再テストの工数削減に、役立てることができます。
ただ、メリットだけではなく、下記の様なデメリットも多くあります。
・対象プログラムが自動テストに適さない記載方法だった場合、自動テストの実装が困難。
・プログラム修正に伴い、自動テストソースの修正も発生する。(工数増大)
・ユーザ目線のビジュアル的なテスト(確認)には不向きな傾向がある。
こちらの記事では、C#、MsTestを利用した簡単なサンプルを例に自動テストを実施し、
自動テストのイメージを紹介できればと思います。
自動テストの実装
0.テスト対象プログラムの準備
まずは、自動テストを実施するプログラムを準備します。
今回は、下記の様な「文字列暗号化PG」を対象とし、
テスト用テキストが、期待通り「暗号」→「復号」されていることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
using System.Text; using System.Security.Cryptography; namespace EncryptUtil; public class Class1 { static void Main(string[] args) { // 暗号化文字列 string srcStr = "平文_TESTTEXT"; // 暗号化 string encText = EncryptUtil.Encrypt(srcStr); // 復号化 string decText = EncryptUtil.Decrypt(encText); Console.WriteLine("おわり"); } } public static class EncryptUtil { // 定数 const string PASS = "TestPass1234567887654321"; const string IV = "At42Gph@"; /// <summary> /// 暗号化 /// </summary> /// <param name="text">平文</param> /// <returns>暗号文</returns> public static string Encrypt(string text) { byte[] key = Encoding.UTF8.GetBytes(PASS); byte[] iv = Encoding.UTF8.GetBytes(IV); TripleDESCryptoServiceProvider des3 = new TripleDESCryptoServiceProvider(); byte[] srcByte = Encoding.UTF8.GetBytes(text); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des3.CreateEncryptor(key, iv), CryptoStreamMode.Write); cs.Write(srcByte, 0, srcByte.Length); cs.Close(); byte[] encData = ms.ToArray(); ms.Close(); string encStr = System.Convert.ToBase64String(encData); //Console.WriteLine("暗号文:" + encStr); return encStr; } /// <summary> /// 復号化 /// </summary> /// <param name="text">暗号文</param> /// <returns>平文</returns> public static string Decrypt(string text) { byte[] key = Encoding.UTF8.GetBytes(PASS); byte[] iv = Encoding.UTF8.GetBytes(IV); TripleDESCryptoServiceProvider des3 = new TripleDESCryptoServiceProvider(); byte[] encByte = System.Convert.FromBase64String(text); MemoryStream ms2 = new MemoryStream(); CryptoStream cs2 = new CryptoStream(ms2, des3.CreateDecryptor(key, iv), CryptoStreamMode.Write); cs2.Write(encByte, 0, encByte.Length); cs2.Close(); byte[] decByte = ms2.ToArray(); ms2.Close(); string decStr = Encoding.UTF8.GetString(decByte); //Console.WriteLine("平文:" + decStr); return decStr; } } |
1.ターミナルでコマンド入力し、テスト用プロジェクトを作成します。
1 |
dotnet new mstest -o EncryptUtilTest |
2.上記コマンドから、下記のテスト用ソースが自動生成されていることを確認します。(UnitTest1.cs)
1 2 3 4 5 6 7 8 9 10 |
namespace EncryptUtilTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } |
3.テストを実行するため、テストプロジェクトをソリューションに追加します。
1 |
dotnet sln add EncryptUtilTest/EncryptUtilTest.csproj |
4.テストを実行するため、プロジェクト参照を追加します。
1 |
dotnet add EncryptUtilTest/EncryptUtilTest.csproj reference EncryptUtil/EncryptUtil.csproj |
5.テストソースの実装
テスト実施手順として下記の通り、テストソースを実装します。
①.12行目でテスト用テキストを変数に設定
②.14行目で、文字列を暗号化
③.15行目で、暗号化した文字列を復号化
④.18行目で、正しく復号化されたことを検証(Assert)で確認
(「期待値(testText)」と「復号化文字(dec)」をAreEqual関数で比較し、同一であればテスト合格)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Security.Cryptography; using EncryptUtil; namespace EncryptUtilTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { string testText = "SmallitTestText234567890"; string enc = EncryptUtil.EncryptUtil.Encrypt(testText); string dec = EncryptUtil.EncryptUtil.Decrypt(enc); // 検証 Assert.AreEqual(dec, testText); } } |
自動テストの実施
1.ターミナルより下記コマンドで、自動テストを実行
1 |
dotnet test EncryptUtilTest/EncryptUtilTest.csproj |
2.テスト結果
テスト結果として、合格1件が表示されテスト結果が期待値通りであったことがわかる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
PS C:\Users\Smallit\OneDrive - 株式会社Smallit\ドキュメント\Local_Doc\Sample> dotnet test EncryptUtilTest/EncryptUtilTest.csproj 復元対象のプロジェクトを決定しています... 復元対象のすべてのプロジェクトは最新です。 EncryptUtil -> C:\Users\Smallit\OneDrive - 株式会社Smallit\ドキュメント\Local_Doc\Sample\EncryptUtil\bin\Debug\net6.0\EncryptUtil.dll EncryptUtilTest -> C:\Users\Smallit\OneDrive - 株式会社Smallit\ドキュメント\Local_Doc\Sample\EncryptUtilTest\bin\Debug\net6.0\EncryptUtilTest.dll C:\Users\Smallit\OneDrive - 株式会社Smallit\ドキュメント\Local_Doc\Sample\EncryptUtilTest\bin\Debug\net6.0\EncryptUtilTest.dll (.NETCoreApp,Version=v6.0) のテスト実行 Microsoft (R) Test Execution Command Line Tool Version 17.3.0 (x64) Copyright (c) Microsoft Corporation. All rights reserved. テスト実行を開始しています。お待ちください... 合計 1 個のテスト ファイルが指定されたパターンと一致しました。 成功! -失敗: 0、合格: 1、スキップ: 0、合計: 1、期間: 19 ms - EncryptUtilTest.dll (net6.0) |
最後に
今回実装した自動テストは、「メソッドの戻り値」を文字列の比較でテスト結果を判定しているが、
実際のテストでは、この様な単純なものばかりではなく、下記の様な検証も必要となる。
・対象のオブジェクトの型が同一やNullである
・スローされた例外が期待値通りである
・検証対象が複雑なクラスや、非公開(private)オブジェクトの状態を検証する必要がある。
そのため、自動テストをプロジェクトに採用する際には、
テストモジュールを実装する技術者にも相応のスキルが求められること、
自動テストを実施する範囲、利用するツール等を考慮する必要があります。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>