【UiPath】コード化されたテストケースでテスト自動化（ブラウザ）を試す

# 初めに
2023.10 にて正式リリースとなったコード化されテストケースを使ってテスト自動化してみようと思います。


# テストケース概要

１．UiPath Orchestrator に登録されたテストキューアイテム（ローン申請データ）を取得する
２．取得したキューデータに対して、年齢データが18以下のものを省く
３．UiBank（自動化練習用ウェブサイト）を開く（https://uibank.uipath.com/loans/apply）
４．ひたすら申請項目を入力し、申請ボタンを押下
５．承認された金利を画面から取得する
６．取得した金利に対して、判定を行う
　　金利＝８％の場合、　結果はＯＫ
  　上記以外の場合、結果はＮＧ

# 実際に作ってみたもの

```c#　LoanApplication.cs
namespace _2024_TestCase
{
    //ローン申請データをクラス化
    public class LoanApplication
    {
        public string age {get;set;}
		public string yearlyIncome {get;set;}
		public string emailAddress {get;set;}
		public string loanAmount {get;set;}
		public string loanTerm {get;set;}
		public string loanRate {get;set;}
		public string loanID {get;set;}
    }
}
```

```c# UiBankLoanApplication.cs


namespace _2024_TestCase
{
    public class UiBankLoanApplication : CodedWorkflow
    {

        LoanApplication newLoan = new LoanApplication();

        //テストケースはここから
        [TestCase]
        public void Execute(System.Collections.Generic.IDictionary<System.String, System.Object> UiBankLoanApplication_TestDataQueue)
        {         
            
            var queueitem = new Dictionary<string,object>();
            
            for(int i = 0; i < 5; i++) {
                // テストキューからテストデータを取得する　
                // キューの名前：UiBankLoanApplication_TestDataQueue
                // キューの格納先フォルダ名：Shared
                queueitem = testing.GetTestDataQueueItem("UiBankLoanApplication_TestDataQueue","Shared");
                
                // 年齢データが18以下のものを省く
                if (Convert.ToInt32(queueitem["Age"].ToString())>18 )
                {
                    // Initialize loan application variables
                    initializeLoanClass(queueitem["Age"].ToString(),queueitem["Email ID"].ToString(),queueitem["Loan Amount"].ToString(),queueitem["Loan Term"].ToString(),queueitem["Yearly Income"].ToString());
                    
                    // UiBankを開き、ローン申請画面に遷移
                    NavigateToLoanApplicationScreen();
                    
                    // 関数ApplyforLoanを呼び出し、ローン申請処理を行い、金利データを取得する
                    newLoan.loanRate = ApplyForLoan();
                    
                    //金利は8%であるかを確認
                    testing.VerifyExpression(newLoan.loanRate.Contains("8"));
                }
                
            }
        }

        //Loanクラスを初期化
        public void initializeLoanClass(string age, string emailAddress, string loanAmount, string loanTerm, string yearlyIncome)
        {
            newLoan.age = age;
            newLoan.emailAddress = emailAddress;
            newLoan.loanAmount = loanAmount;
            newLoan.loanTerm = loanTerm;
            newLoan.yearlyIncome = yearlyIncome;
        }

        //UiBankを開き、UI操作でローン申請画面に繊維
        public void NavigateToLoanApplicationScreen()
        {
            //オブジェクトリポジトリを利用します。
            var homeScreen = uiAutomation.Open(Descriptors.Chrome__UiBank_app.Chrome__UiBank);
            
            homeScreen.Click(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Products);
            homeScreen.Click(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Loans);
            homeScreen.Click("Apply For A Loan");
        }


        //金利申請
        public string ApplyForLoan()
        {

            string loanRate = null;
            
            //オブジェクトリポジトリを利用します。
            var loanScreen = uiAutomation.Attach(Descriptors.Chrome__UiBank_app.Chrome__UiBank);
            
            //文字入力で申請項目を埋める
            loanScreen.TypeInto(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Email_Address,newLoan.emailAddress);
            loanScreen.TypeInto(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Loan_Amount_Requested,newLoan.loanAmount);
            loanScreen.TypeInto(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Loan_Term,newLoan.loanTerm);
            loanScreen.TypeInto(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Current_Yearly,newLoan.yearlyIncome);
            loanScreen.TypeInto(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Age,newLoan.age);
            
            // Submit Applicationボタンをクリック
            ClickOptions co = new ClickOptions();
            // クリック操作はシミュレートで行う
            co.InteractionMode = NChildInteractionMode.Simulate;
            loanScreen.Click(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Submit_Loan_Application,co);loanScreen.Click(Descriptors.Chrome__UiBank_app.Chrome__UiBank.Submit_Loan_Application);
            
            //申請結果画面にアタッチ
            var LoanApprovedScreen = uiAutomation.Attach(Descriptors.Chrome__UiBank_app.Loan_Approved_or_Denied);
            
            //申請結果金利を返却
            return LoanApprovedScreen.GetText(Descriptors.Chrome__UiBank_app.Loan_Approved_or_Denied.Loan_Rate);
            
            
            
        }

    }
}


```

# 感想
・　オブジェクトリポジトリとの相性が抜群（UI操作簡単にコード化できる）
・　開発作業効率ですが、アクティビティでテストケース作成することと比べたら、それほど差はない。（アクティビティの利用に慣れていることが大きいでしょうね）
・　UI操作の調整（シミュレート、Delayなど）を行う場合、少しなれが必要。
・　成果物が.csファイルとなりましたので、差分管理がしやすくなる想定。