Спасибо @ jgoldberger-MSFT и @ SushiHangover за их комментарии.
В итоге у меня было два варианта для достижения моей цели:
Настройка XUnit для Xamarin Android
Вы можете запускать тесты на устройстве с помощью xUnit Framework и xUnit.Runner.Devices . Однако тестовый пакет (все ваши классы тестирования и настройки) должен быть присоединен к текущему проекту Android Xamarin в решении , чтобы ссылка на тот же проект (включая классы, ресурсы и контекст) заявки) могут быть использованы удовлетворительно. В противном случае это приведет к множеству бесконечных ошибок, относящихся к ресурсам Android, потому что вы не можете соединить два приложения.
После установки обеих платформ, упомянутых выше, просто настройте параметры запуска следующим образом:
- В верхней части класса Activity MainLauncher определите директиву препроцессора : это позволит вам запускать приложение для тестов или с нормальным потоком. Обратите внимание, что в нем есть директива Debug, которая позволит вам выполнить условие, только если приложение будет развернуто в режиме отладки.
.
//#define TEST // Uncomment this to start UnitTestig
. . .
[ /* Your ActivityAttributes */ ]
public class YourLauncherActivity : Activity {
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
#if (DEBUG && TEST)
// Your TestConfiguration.cs Activity
Intent iTestConfiguration = new Intent(this, typeof(TestConfiguration));
StartActivity(iTestConfiguration);
#endif
#if !TEST
// Run your normal Activity here, like Login, etc...
#endif
}
}
...
Ваше тестовое задание должно выглядеть примерно так: TestConfiguration.cs
[Activity(Label = "TestConfiguration")]
public class TestConfiguration : Xunit.Runners.UI.RunnerActivity
{
//public static Context Context { get; set; }
protected override void OnCreate(Bundle bundle)
{
// tests can be inside the main assembly
AddTestAssembly(Assembly.GetExecutingAssembly());
AddExecutionAssembly(typeof(ExtensibilityPointFactory).Assembly);
// or in any reference assemblies
//this.AutoStart = true;
base.OnCreate(bundle);
//Context = this;
}
}
Затем определите свои тесты в рамках проекта, используя xUnit Framework , например: MyTests.cs
public class MyTests
{
public MyTests()
{
// Before each test
}
[Fact]
public void FailingTest()
{
Assert.True(false);
}
}
Теперь вы можете запускать тесты на созданной активности xUnit Runner для устройств.
Настройка Xamarin Android Instrumentation
Теперь, если вы хотите запустить инструментальное тестирование в проекте Xamarin Android, вам нужно сделать следующее:
Прежде всего, выполните следующее руководство шаг за шагом:
После завершения добавьте статическую ссылку на вашу TestSuiteInstrumentation в классе конфигурации вашего теста, например: TestInstrumentation.cs
. . .
public static TestSuiteInstrumentation CurrentInstrumentation { get; set; }
public TestInstrumentation(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
{
CurrentInstrumentation = this;
}
. . .
Теперь, если вы хотите настроить свои тесты так, чтобы вы неявно запускали Activity и использовали ее представления, свойства и т. Д. ... Вы можете сделать следующее: Пример для моего Login.cs Activity
[TestFixture]
public class LoginTests
{
private TestSuiteInstrumentation instrument = TestInstrumentation.CurrentInstrumentation;
private Activity CurrentActivity;
[SetUp]
public void SetUp()
{
Instrumentation.ActivityMonitor monitor = instrument.AddMonitor($"{instrument.TargetContext.PackageName}." + nameof(Login), null, false);
Intent intent = new Intent();
intent.AddFlags(ActivityFlags.NewTask);
intent.SetClassName(instrument.TargetContext, $"{instrument.TargetContext.PackageName}." + nameof(Login));
Task.Run(() => instrument.StartActivitySync(intent)).GetAwaiter();
Activity currentActivity = instrument.WaitForMonitor(monitor);
}
[Test]
public void LoginTest()
{
// Verify your activity is not null
Assert.NotNull(CurrentActivity);
// Convert CurrentActivity to your Activity
Login login = CurrentActivity as Login;
// Verify your views are not null, finding views in your Activity
Assert.NotNull(login);
Assert.NotNull(login.FindViewById<EditText>(Resource.Id.etLoginUsername));
Assert.NotNull(login.FindViewById<EditText>(Resource.Id.etLoginPassword));
instrument.RunOnMainSync(() => {
// Here you can run your UI methods or properties for Views, example
login.FindViewById<EditText>(Resource.Id.etLoginUsername).Text = "hello";
login.FindViewById<EditText>(Resource.Id.etLoginPassword).Text = "world";
});
// Here will be your assertions
}
}
Теперь запустите ваш тест с ADB. Выполните следующие действия:
- Разверните ваше приложение в режиме отладки или выпуска. Тогда прекрати.
Найдите свои контрольно-измерительные приборы, используйте следующую команду:
adb shell pm list instrumentation
Скопируйте полное имя теста, который вы хотите выполнить, и выполните следующую команду:
adb shell am instrument -w /*paste the full name of your instrumentation test*/
ВАЖНО: Ваша деятельность должна иметь определенное имя в ActivityAttribute, чтобы файл classes.dex не смог найти ваш класс. Например, если мой PackageName равен com.yourpackage.android
, а мой класс активности - Login.cs при вашем ActivityAttributes
добавьте:
[Activity( ... , Name ="com.yourpackage.android.Login", ...)]