Android NUnit 테스트 프로젝트를 자동화하려면 어떻게 할까요?How do I automate an Android NUnit Test project?

참고

이 가이드에서는 UITest 프로젝트가 아닌 Android NUnit 테스트 프로젝트를 자동화 하는 방법을 설명 합니다.This guide explains how to automate an Android NUnit test project, not a Xamarin.UITest project. UITest 가이드는 여기에서 찾을 수 있습니다.Xamarin.UITest guides can be found here.

Visual Studio (또는 Mac용 Visual Studio의 Android 단위 테스트 프로젝트)에서 단위 테스트 앱 (android) 프로젝트를 만들면이 프로젝트는 기본적으로 테스트를 자동으로 실행 하지 않습니다.When you create a Unit Test App (Android) project in Visual Studio (or Android Unit Test project in Visual Studio for Mac), this project will not automatically run your tests by default. 대상 장치에서 NUnit 테스트를 실행 하려면 다음 명령을 사용 하 여 시작 되는 Android. Instrumentation 하위 클래스를 만들 수 있습니다.To run NUnit tests on a target device, you can create an Android.App.Instrumentation subclass that is started by using the following command:

adb shell am instrument 

다음 단계는이 프로세스를 설명 합니다.The following steps explain this process:

  1. TestInstrumentation.cs라는 새 파일을 만듭니다.Create a new file called TestInstrumentation.cs:

    using System;
    using System.Reflection;
    using Android.App;
    using Android.Content;
    using Android.Runtime;
    using Xamarin.Android.NUnitLite;
    
    namespace App.Tests {
    
        [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 ());
            }
        }
    }
    

    이 파일에서 Xamarin.Android.NUnitLite.TestSuiteInstrumentation ( xamarin.ios에서)를 TestInstrumentation를 만들도록 서브클래싱 합니다.In this file, Xamarin.Android.NUnitLite.TestSuiteInstrumentation (from Xamarin.Android.NUnitLite.dll) is subclassed to create TestInstrumentation.

  2. TestInstrumentation 생성자 및 AddTests 메서드를 구현 합니다.Implement the TestInstrumentation constructor and the AddTests method. AddTests 메서드는 실제로 실행 되는 테스트를 제어 합니다.The AddTests method controls which tests are actually executed.

  3. .csproj 파일을 수정 하 여 TestInstrumentation.cs를 추가 합니다.Modify the .csproj file to add TestInstrumentation.cs. 예를 들면,For example:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        ...
        <ItemGroup>
            <Compile Include="TestInstrumentation.cs" />
        </ItemGroup>
        <Target Name="RunTests" DependsOnTargets="_ValidateAndroidPackageProperties">
            <Exec Command="&quot;$(_AndroidPlatformToolsDirectory)adb&quot; $(AdbTarget) $(AdbOptions) shell am instrument -w $(_AndroidPackage)/app.tests.TestInstrumentation" />
        </Target>
        ...
    </Project>
    
  4. 다음 명령을 사용 하 여 단위 테스트를 실행 합니다.Use the following command to run the unit tests. PACKAGE_NAME를 앱의 패키지 이름으로 바꿉니다. 패키지 이름은 Androidmanifest에 있는 앱의 /manifest/@package 특성에서 찾을 수 있습니다.Replace PACKAGE_NAME with the app's package name (the package name can be found in the app's /manifest/@package attribute located in AndroidManifest.xml):

    adb shell am instrument -w PACKAGE_NAME/app.tests.TestInstrumentation
    
  5. 필요에 따라 .csproj 파일을 수정 하 여 RunTests MSBuild 대상을 추가할 수 있습니다.Optionally, you can modify the .csproj file to add the RunTests MSBuild target. 이렇게 하면 다음과 같은 명령을 사용 하 여 단위 테스트를 호출할 수 있습니다.This makes it possible to invoke the unit tests with a command like the following:

    msbuild /t:RunTests Project.csproj
    

    이 새 대상을 사용 해야 하는 것은 아닙니다. 이전 adb 명령은 msbuild대신 사용할 수 있습니다.(Note that using this new target is not required; the earlier adb command can be used instead of msbuild.)

adb shell am instrument 명령을 사용 하 여 단위 테스트를 실행 하는 방법에 대 한 자세한 내용은 Android 개발자가 ADB를 사용 하 여 테스트 실행 항목을 참조 하세요.For more information about using the adb shell am instrument command to run unit tests, see the Android Developer Running tests with ADB topic.

참고

Xamarin android 5.0 릴리스를 사용 하는 경우 Android 호출 가능 래퍼의 기본 패키지 이름은 내보내는 형식의 어셈블리 정규화 된 이름에 대 한 MD5SUM을 기반으로 합니다.With the Xamarin.Android 5.0 release, the default package names for Android Callable Wrappers will be based on the MD5SUM of the assembly-qualified name of the type being exported. 이렇게 하면 서로 다른 두 어셈블리에서 동일한 정규화 된 이름을 제공할 수 있으며 패키징 오류가 발생 하지 않습니다.This allows the same fully-qualified name to be provided from two different assemblies and not get a packaging error. 따라서 Instrumentation 특성의 Name 속성을 사용 하 여 읽을 수 있는 ACW/클래스 이름을 생성 해야 합니다.So make sure that you use the Name property on the Instrumentation attribute to generate a readable ACW/class name.

ACW 이름은 위의 adb 명령에 사용 해야 합니다.The ACW name must be used in the adb command above. 따라서 클래스의 C# 이름을 바꾸고 리팩터링 하면 올바른 acw 이름을 사용 하기 위해RunTests명령을 수정 해야 합니다.Renaming/refactoring the C# class will thus require modifying the RunTests command to use the correct ACW name.