Nhắm mục tiêu một ví dụ ứng dụng

Danh mục kiểm thử đo lường này không khác nhiều so với các danh mục kiểm thử nhắm đến các ứng dụng Android thông thường. Xin lưu ý rằng ứng dụng kiểm thử có chứa khả năng đo lường cần được ký bằng cùng một chứng chỉ với ứng dụng mà ứng dụng kiểm thử nhắm đến.

Xin lưu ý rằng hướng dẫn này giả định rằng bạn đã có một số kiến thức về quy trình làm việc của cây nguồn nền tảng. Nếu không, vui lòng tham khảo Yêu cầu. Ví dụ được đề cập ở đây là viết một kiểm thử đo lường mới với gói mục tiêu được đặt tại gói ứng dụng kiểm thử của riêng nó. Nếu bạn chưa hiểu rõ về khái niệm này, vui lòng đọc qua Giới thiệu về hoạt động kiểm thử nền tảng.

Tài liệu hướng dẫn này sử dụng quy trình kiểm thử sau đây để làm mẫu:

  • frameworks/base/packages/Shell/tests

Bạn nên duyệt qua mã trước để có được ấn tượng sơ bộ trước khi tiếp tục.

Quyết định vị trí nguồn

Vì kiểm thử đo lường sẽ nhắm đến một ứng dụng, nên quy ước là đặt mã nguồn kiểm thử trong thư mục tests trong thư mục gốc của thư mục nguồn thành phần trong cây nguồn của nền tảng.

Xem thêm các nội dung thảo luận về vị trí nguồn trong ví dụ toàn diện về kiểm thử tự đo lường.

Tệp kê khai

Giống như một ứng dụng thông thường, mỗi mô-đun kiểm thử đo lường cần có một tệp kê khai. Nếu bạn đặt tên tệp là AndroidManifest.xml và cung cấp tệp đó bên cạnh Android.mk cho mô-đun kiểm thử, thì tệp đó sẽ tự động được đưa vào tệp makefile cốt lõi BUILD_PACKAGE.

Trước khi tiếp tục, bạn nên đọc bài viết Tổng quan về tệp kê khai ứng dụng trước.

Phần này cung cấp thông tin tổng quan về các thành phần cơ bản của tệp kê khai và chức năng của các thành phần đó.

Bạn có thể truy cập vào phiên bản mới nhất của tệp kê khai cho thay đổi gerrit mẫu tại: https://android.googlesource.com/platform/frameworks/base/+/main/packages/Shell/tests/AndroidManifest.xml

Để thuận tiện, chúng tôi cung cấp một bản tổng quan nhanh tại đây:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.shell.tests">

    <application>
        <uses-library android:name="android.test.runner" />

        <activity
            android:name="com.android.shell.ActionSendMultipleConsumerActivity"
            android:label="ActionSendMultipleConsumer"
            android:theme="@android:style/Theme.NoDisplay"
            android:noHistory="true"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>
    </application>

    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
        android:targetPackage="com.android.shell"
        android:label="Tests for Shell" />

</manifest>

Một số nhận xét chọn lọc về tệp kê khai:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.shell.tests">

Thuộc tính package là tên gói ứng dụng: đây là giá trị nhận dạng duy nhất mà khung ứng dụng Android sử dụng để xác định một ứng dụng (hoặc trong ngữ cảnh này: ứng dụng kiểm thử của bạn). Mỗi người dùng trong hệ thống chỉ có thể cài đặt một ứng dụng có tên gói đó.

Vì đây là gói ứng dụng kiểm thử, độc lập với gói ứng dụng đang được kiểm thử, nên bạn phải sử dụng một tên gói khác: một quy ước phổ biến là thêm hậu tố .test.

Hơn nữa, thuộc tính package này giống với giá trị mà ComponentName#getPackageName() trả về, đồng thời cũng giống với giá trị bạn sẽ sử dụng để tương tác với nhiều lệnh phụ pm thông qua adb shell.

Ngoài ra, xin lưu ý rằng mặc dù tên gói thường có cùng kiểu với tên gói Java, nhưng thực tế thì tên gói này có rất ít điểm chung với tên gói Java. Nói cách khác, gói ứng dụng (hoặc kiểm thử) của bạn có thể chứa các lớp có tên gói bất kỳ, mặc dù mặt khác, bạn có thể chọn đơn giản và đặt tên gói Java cấp cao nhất trong ứng dụng hoặc kiểm thử giống với tên gói ứng dụng.

<uses-library android:name="android.test.runner" />

Điều này là bắt buộc đối với tất cả các kiểm thử đo lường vì các lớp liên quan được đóng gói trong một tệp thư viện jar khung riêng biệt, do đó, cần có thêm các mục nhập đường dẫn lớp khi gói kiểm thử được khung ứng dụng gọi.

android:targetPackage="com.android.shell"

Thao tác này sẽ đặt gói mục tiêu của khả năng đo lường thành com.android.shell. Khi được gọi thông qua lệnh am instrument, khung sẽ khởi động lại quy trình com.android.shell và chèn mã đo lường vào quy trình để thực thi kiểm thử. Điều này cũng có nghĩa là mã kiểm thử sẽ có quyền truy cập vào tất cả các thực thể lớp đang chạy trong ứng dụng đang được kiểm thử và có thể thao tác trạng thái tuỳ thuộc vào các trình kích hoạt kiểm thử được hiển thị.

Tệp cấu hình đơn giản

Mỗi mô-đun kiểm thử mới phải có một tệp cấu hình để hướng dẫn hệ thống xây dựng bằng siêu dữ liệu mô-đun, các phần phụ thuộc tại thời điểm biên dịch và hướng dẫn đóng gói. Trong hầu hết các trường hợp, tuỳ chọn tệp Blueprint dựa trên Soong là đủ. Xem phần Cấu hình kiểm thử đơn giản để biết chi tiết.

Tệp cấu hình phức tạp

Đối với các chương trình kiểm thử phức tạp hơn, bạn cũng cần viết tệp cấu hình kiểm thử cho bộ kiểm thử của Android, Trade Federation.

Cấu hình kiểm thử có thể chỉ định các tuỳ chọn thiết lập thiết bị đặc biệt và đối số mặc định để cung cấp lớp kiểm thử.

Bạn có thể truy cập vào phiên bản mới nhất của tệp cấu hình cho thay đổi gerrit mẫu tại: frameworks/base/packages/Shell/tests/AndroidTest.xml

Để thuận tiện, chúng tôi cung cấp một bản tổng quan nhanh tại đây:

<configuration description="Runs Tests for Shell.">
    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
        <option name="test-file-name" value="ShellTests.apk" />
    </target_preparer>

    <option name="test-suite-tag" value="apct" />
    <option name="test-tag" value="ShellTests" />
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="com.android.shell.tests" />
        <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
    </test>
</configuration>

Một số nhận xét chọn lọc về tệp cấu hình kiểm thử:

<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
  <option name="test-file-name" value="ShellTests.apk"/>
</target_preparer>

Thao tác này sẽ yêu cầu Trade Federation cài đặt ShellTests.apk trên thiết bị mục tiêu bằng cách sử dụng target_preparer đã chỉ định. Có nhiều trình chuẩn bị mục tiêu cho các nhà phát triển trong Liên đoàn Thương mại và có thể dùng những trình chuẩn bị mục tiêu này để đảm bảo thiết bị được thiết lập đúng cách trước khi chạy thử nghiệm.

<test class="com.android.tradefed.testtype.AndroidJUnitTest">
  <option name="package" value="com.android.shell.tests"/>
  <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>

Thao tác này chỉ định lớp kiểm thử Trade Federation để sử dụng nhằm thực thi kiểm thử và truyền trong gói trên thiết bị sẽ được thực thi và khung trình chạy kiểm thử là JUnit trong trường hợp này.

Hãy xem tại đây để biết thêm thông tin về Cấu hình mô-đun kiểm thử

Các tính năng của JUnit4

Việc sử dụng thư viện android-support-test làm trình chạy kiểm thử cho phép sử dụng các lớp kiểm thử kiểu JUnit4 mới và thay đổi gerrit mẫu chứa một số cách sử dụng rất cơ bản các tính năng của thư viện này.

Bạn có thể truy cập vào mã nguồn mới nhất cho thay đổi trong tệp gerrit mẫu tại: frameworks/base/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java

Mặc dù các mẫu kiểm thử thường dành riêng cho các nhóm thành phần, nhưng có một số mẫu sử dụng thường hữu ích.

@SmallTest
@RunWith(AndroidJUnit4.class)
public final class FeatureFactoryImplTest {

Một điểm khác biệt đáng kể trong JUnit4 là kiểm thử không còn bắt buộc phải kế thừa từ một lớp kiểm thử cơ sở phổ biến nữa; thay vào đó, bạn sẽ viết mã kiểm thử trong các lớp Java thuần tuý và sử dụng chú giải để chỉ ra một số quy tắc thiết lập kiểm thử và các quy tắc ràng buộc nhất định. Trong ví dụ này, chúng tôi hướng dẫn rằng lớp này sẽ được chạy dưới dạng kiểm thử Android JUnit4.

Chú thích @SmallTest đã chỉ định kích thước kiểm thử cho toàn bộ lớp kiểm thử: tất cả các phương thức kiểm thử được thêm vào lớp kiểm thử này đều kế thừa chú thích kích thước kiểm thử này. thiết lập lớp kiểm thử trước, gỡ bỏ lớp kiểm thử sau và gỡ bỏ lớp kiểm thử sau: tương tự như các phương thức setUptearDown trong JUnit4. Chú giải Test được dùng để chú thích kiểm thử thực tế.

    @Before
    public void setup() {
    ...
    @Test
    public void testGetProvider_shouldCacheProvider() {
    ...

Chú thích @Before được JUnit4 sử dụng trên các phương thức để thực hiện việc thiết lập trước kiểm thử. Mặc dù không được sử dụng trong ví dụ này, nhưng cũng có @After để phân tích sau khi kiểm thử. Tương tự, JUnit4 có thể sử dụng chú thích @BeforeClass@AfterClass trên các phương thức để thiết lập trước khi thực thi tất cả các bài kiểm thử trong một lớp kiểm thử và sau đó huỷ thiết lập. Xin lưu ý rằng các phương thức thiết lập và gỡ bỏ trong phạm vi lớp phải là tĩnh.

Đối với các phương thức kiểm thử, không giống như trong phiên bản JUnit trước, các phương thức này không cần bắt đầu tên phương thức bằng test nữa, thay vào đó, mỗi phương thức phải được chú thích bằng @Test. Như thường lệ, các phương thức kiểm thử phải công khai, không khai báo giá trị trả về, không nhận tham số và có thể gửi ngoại lệ.

        Context context = InstrumentationRegistry.getTargetContext();

Vì các bài kiểm thử JUnit4 không còn yêu cầu lớp cơ sở chung, nên bạn không cần phải lấy các thực thể Context thông qua getContext() hoặc getTargetContext() thông qua các phương thức lớp cơ sở nữa; thay vào đó, trình chạy kiểm thử mới sẽ quản lý các thực thể này thông qua InstrumentationRegistry, nơi lưu trữ chế độ thiết lập môi trường và ngữ cảnh do khung đo lường tạo. Thông qua lớp này, bạn cũng có thể gọi:

  • getInstrumentation(): thực thể của lớp Instrumentation
  • getArguments(): các đối số dòng lệnh được chuyển đến am instrument thông qua -e <key> <value>

Tạo bản dựng và kiểm thử cục bộ

Đối với các trường hợp sử dụng phổ biến nhất, hãy sử dụng Atest.

Đối với các trường hợp phức tạp hơn đòi hỏi phải tuỳ chỉnh nhiều hơn, hãy làm theo hướng dẫn đo lường.