私は現在、Xamarin.FormsのiOSとAndroidのアプリケーションを開発中です。私はこのプロジェクトをWindows 10のVisual Studio 2017で作業しています。 このアプリケーションは、主にXAMLのマークアップを持つ、そのPCLのUI(ビュー)を持っています。このビュー(LoginPage.xaml/LoginPage.xaml.csと呼ばれる)は、UITestを書くのに非常に適しています。また、インターンとして、私はいくつかのUITestを書く必要があります。Buttonsハンドラでasyncメソッドを実行してXamarin.Forms.UITestを実行するにはどうすればよいですか?
これを達成するために、ソリューションでUITestプロジェクトを追加しました。私はこのプロジェクトにNuGet NUnit2.6.4を追加しました.NuGet NUnit2TestAdapter(Xamarinsドキュメントバージョン3以降は、これらのNuGetパッケージはXamarin.UITestsではサポートされていません)。Macを所有していないので、私は適切なAndroid SDKとJava SDKをインストールしなければなりませんでした。ハレイ、テスト自体は機能します。
次のステップでは、ViewのコンポーネントにAutomationIdを追加しました(すべてのボタン、ラベル、ビューなどをAutomationIdに渡しました)。私はそれをしました。私も非常に簡単なテストを持っています:
[Test]
public void ShouldShowMessageOnInvalidInsertedEmailadress()
{
app.WaitForElement(v => v.Marked("btn_StuurMail_aid").Text("Stuur me een e-mail"));
app.EnterText(c => c.Marked("entry_Emailadres_aid"), "a wrong emailadres");
app.DismissKeyboard();
app.Tap(c => c.Marked("btn_StuurMail_aid"));
app.WaitForElement(c => c.Marked("lbl_Error_aid").Text("Dat is geen geldige e-mailadres"));
}
このUITestは、私が望むものとまったく同じです。コードapp.Tap(ボタン)に注目してください。 このボタンに割り当てられているイベントハンドラがタップされます。これにより、イベントハンドラ内のコードが実行されます。イベントハンドラは、挿入された電子メールアドレスが有効かどうかをチェックします。この場合は、ビューにフィードバックを送信しません。これには、ラベルのテキストを「あなたに電子メールを送信できませんでした...」と設定することが含まれます。この変更は、実行時に変更されるため、XAMLではなくC#コードで発生します。これまでのところ、あらゆることが魅力のように働いています。
今は面倒です。同じプロジェクト(UITest)の同じファイル(Test.cs)で新しいTestを作成しました。今すぐ有効なメールアドレスを入力し、同じボタンをタップすると:
[Test]
public void test()
{
app.WaitForElement(v => v.Marked("btn_StuurMail_aid").Text("Stuur me een e-mail"));
app.EnterText(c => c.Marked("entry_Emailadres_aid"), "[email protected]");
app.DismissKeyboard();
app.Tap(c => c.Marked("btn_StuurMail_aid"));
}
同じコードが表示されます。ボタンのイベントハンドラは、挿入された電子メールが有効かどうかをチェックします(電子メールをフォーマットする必要があります)。この場合はそうです。そのため、指定された電子メールアドレスに電子メールを送信するコードがトリガされます。これはAPIへの呼び出しです。つまり、コードを待たなければならず、イベントハンドラは非同期でなければなりません。イベントハンドラのコードは次のようになります。
public async void OnSendMail(object sender, EventArgs args)
{
IsBusy = true;
lbl_Error.IsVisible = false;
if (InsertedEmailIsValid())
{
try
{
lbl_Mededeling.Text = "Je aanmelding wordt verwerkt.";
await repo.RegisterUserAsync(CreateOwnUser());
lbl_Mededeling.Text = "Er wordt een e-mail verstuurd naar het door jou opgegeven e-mailadres";
await repo.SendMail();
lbl_VerwijzingMail.IsVisible = true;
btn_Activeer.IsVisible = true;
lbl_Mededeling.Text = "Er is een mail verstuurd naar " + inputEmail;
entry_Emailadres.IsVisible = false;
btn_StuurMail.IsVisible = false;
IsBusy = false;
}
catch (Exception ex)
{
lbl_Mededeling.Text = "Geef ter activatie een geldig e-mailadres op.";
lbl_Error.Text = "Deze app is niet toegankelijk voor medewerkers van de organisatie waar " +
"het-emailadres bij hoort.";
lbl_Error.IsVisible = true;
IsBusy = false;
}
}
else
{
lbl_Error.IsVisible = true;
IsBusy = false;
}
}
レポを登録し、与えられた電子mailadresに電子メールを送信するために、実際のAPIコールを作るクラスです。これらのメソッドは戻り値の型のTaskを持ち、非同期でもあります(順番にAPI-応答を待つ必要があるため)。
ここで問題が発生します。 UITestのコードが複数のメソッド呼び出しをトリガーするので、UITestがボタンをタップしたときにUIがコードを実行しているようには見えません。 UITestをデバッグしているとき、またはリリースとデバッグのどちらかでアプリケーション自体を実行しているときは、まったく同じコードがうまく動作します。
誰かが私を助けることができますか?
P .:申し訳ありませんが、ランダムなオランダ語/文章のコードです。それらは、ボタン名のようなViewコンポーネントの名前か、私のアプリが画面上に表示するフィードバックです。これらは無視することができます。
インジケータとして使用できる状態についてもう少し詳細を教えてください。 現在、(私の質問と同じコード)ロジックの最初のasyn呼び出しを作成する直前に、ラベルのテキストを '登録中'(オランダ語)に更新しています: lbl_Mededeling.Text = "Je aanmelding単語のverwerkt。 "; await repo.RegisterUserAsync(CreateOwnUser()); その後、ロジックで2番目の非同期コールを作成する直前に、同じラベルのテキストを更新します:lbl_Mededeling.Text = "Eメールで電子メールを送信しようとしました"; await repo.SendMail(); – user7410216
(私の最初のコメントの2番目の部分) 電子メールが正常に送信された後、私は別のボタンをUIに表示します。しかし、私がapp.WaitForElement(theNewButton)を使用すると、テストで例外がスローされます。私は、テストにユーザーを登録して電子メールを送信するためにコードを実行するのに十分な時間があることを確認するために、タイムラインを2分に拡張しました。 – user7410216
説明に従って、app.WaitForElement(theNewButton)を呼び出すことができます。しかし、なぜそれを待つことができないのかを知る必要があります。それは、ボタンがidで正しく設定されていないためですか?または、操作は2分以上かかるだけですか?テストコード内のapp.Repl()を呼び出してデバッグ目的のレプリケーションウィンドウを呼び出すことができます(ボタンに問い合わせることができるかどうかをチェックする) – lowleetak