TestInstrumentation в проекте Xamarin — INSTRUMENT_RESULT равен 0 для пройденных, неудачных и включительно

Кто-нибудь проводил инструментальные тесты с Xamarin.Android? Что мне не хватает?

Я создал свой проект, как указано здесь:

https://kb.xamarin.com/customer/portal/articles/1649768-how-do-i-automate-an-android-unit-test-project-

Однако, когда я запускаю тестовые примеры в эмуляторе, используя:

adb shell am tool -w @PACKAGE_NAME@/app.tests.TestInstrumentation

Он выполняется, но показывает результаты ниже.

Instrument_Result: пройдено: 0

Instrument_Result: не удалось: 0

Instrument_Result: включительно: 0

Может ли кто-нибудь сообщить мне, что мне не хватает?


person Vishwas Rao    schedule 06.08.2016    source источник


Ответы (2)


Когда создается проект Android Unit Test, я просто помещаю подкласс TestSuiteInstrumentation в подкласс MainActivity.cs вместе с подклассом TestSuiteActivity:

Пример TestSuiteInstrumentation:

[Activity(Label = "SomeUnitTests", MainLauncher = true)]
public class MainActivity : TestSuiteActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        // tests can be inside the main assembly
        AddTest(Assembly.GetExecutingAssembly());
        // or in any reference assemblies
        // AddTest (typeof (Your.Library.TestClass).Assembly);

        // Once you called base.OnCreate(), you cannot add more assemblies.
        base.OnCreate(bundle);
    }
}

[Instrumentation(Name = "app.tests.TestInstrumentation")]
public class TestInstrumentation : TestSuiteInstrumentation
{
    public TestInstrumentation(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { }

    protected override void AddTests()
    {
        AddTest(Assembly.GetExecutingAssembly());
    }
}

Модульные тесты:

В этом примере используются тесты, автоматически сгенерированные с помощью проекта Android Unit Test:

[Test]
public void Pass()
{
    Console.WriteLine("test1");
    Assert.True(true);
}

[Test]
public void Fail()
{
    Assert.False(true);
}

[Test]
[Ignore("another time")]
public void Ignore()
{
    Assert.True(false);
}

[Test]
public void Inconclusive()
{
    Assert.Inconclusive("Inconclusive");
}

Запустить тесты

  • Скомпилируйте и разверните apk модульного теста на свое устройство или эмулятор.

  • Запустите тесты через adb

    • Note: My unit test project is named SomeUnitTests and has no predefined manifest so the generated package name for this "app" becomes: com.sushihangover.someunittests

Команда АБР:

adb shell am tool -w com.sushihangover.someunittests/app.tests.TestInstrumentation

Тестовый вывод:

INSTRUMENTATION_RESULT: failed=1
INSTRUMENTATION_RESULT: inconclusive=1
INSTRUMENTATION_RESULT: passed=1
~~~
INSTRUMENTATION_RESULT: skipped=1
INSTRUMENTATION_CODE: 0
person SushiHangover    schedule 06.08.2016
comment
Спасибо за ответ, я придерживаюсь того же подхода. Но когда я запускаю adb shell am tool -w ... результаты команды заканчиваются Instrument_Result: передано: 0 Instrument_Result: не удалось: 0 Instrument_Result: включительно: 0 Какая может быть возможность для этого? - person Vishwas Rao; 07.08.2016
comment
@VishwasRao Если вы запускаете свои модульные тесты через пользовательский интерфейс на устройстве, они сообщают о тех же результатах? - person SushiHangover; 07.08.2016
comment
Нет, пользовательский интерфейс обнаруживает мои тестовые случаи. Он сообщает, что все тестовые случаи пройдены (пройдено 22 тестовых случая). Я предполагаю, что проблема связана с тестовым оборудованием. Я пытаюсь выяснить, почему об этом не сообщается, когда я запускаю инструмент adb shell am -w ... ..? - person Vishwas Rao; 07.08.2016
comment
@VishwasRao — это ваш класс TestInstrumentation, определенный в том же файле, что и файл MainActivity.cs вашего модульного теста, и загружающий ту же тестовую сборку через AddTest? то есть что-то вроде: AddTest(Assembly.GetExecutingAssembly()); - person SushiHangover; 07.08.2016
comment
Он находится в другом файле. И я включаю этот файл для компиляции. Да, я переопределяю метод Addtest, чтобы добавить тестовую сборку. - person Vishwas Rao; 07.08.2016
comment
@VishwasRao Одинаково ли AddTest в классах TestInstrumentation и MainActivity? - person SushiHangover; 07.08.2016
comment
Да. В методе AddTest я загружаю исполняемую сборку AddTest(Assembly.GetExecutingAssembly()) как в классе MainActivity, так и в классе TestInstrumentation. - person Vishwas Rao; 07.08.2016
comment
@VishwasRao Если выполнение класса TestInstrumentation не находит никаких тестов для выполнения, оно не находит никаких тестов в той же сборке, которую использует ваш UnitTest MainActivity AddTest, поскольку он находит ваши тесты. В качестве теста поместите класс TestInstrumentation в тот же файл, что и MainActivity модульного теста, как я сделал в примере моего ответа, скомпилируйте, установите и повторно запустите тесты (визуально на устройстве и через adb) и сравните два результата. - person SushiHangover; 07.08.2016
comment
@Sushil Пытался поместить класс TestInstrumentation в основной файл активности. Все равно не повезло. Требуются ли какие-либо изменения в манифесте? - person Vishwas Rao; 08.08.2016
comment
@VishwasRao В приложении Android Unit Test нет определяемого пользователем манифеста. Вы помещаете TestInstrumentation в проект модульного теста? Я бы создал новый проект Android Unit Test и ничего не менял, кроме добавления в него класса TestInstrumentation и компиляции/установки/запуска его с 4 сгенерированными шаблонами тестами... что происходит? - person SushiHangover; 08.08.2016
comment
Привет, я пробовал выше шаги, все еще не повезло. Это из-за отсутствия каких-либо ссылок на xamarin ..? - person Vishwas Rao; 17.08.2016

После долгих отладок я обнаружил проблему.

В TestFixtureSetup возникло исключение из-за служб зависимостей, из-за чего другие тесты не выполнялись. Это исключение не регистрирует никаких сообщений об ошибках, поэтому мне не удалось легко выяснить основную причину.

person Vishwas Rao    schedule 18.08.2016