Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Ví dụ về các bài kiểm tra tự dụng cụ

Khi bắt đầu kiểm tra thiết bị, gói đích của nó sẽ được khởi động lại với mã thiết bị được đưa vào và bắt đầu thực thi. Một ngoại lệ là các gói mục tiêu ở đây không thể là khung ứng dụng Android chính nó, tức là gói android , bởi vì làm như vậy sẽ dẫn đến tình trạng nghịch lý nơi khung Android sẽ cần phải được khởi động lại, đó là những gì hỗ trợ các chức năng hệ thống, bao gồm các thiết bị đo đạc chinh no.

Điều này có nghĩa là một bài kiểm tra thiết bị đo không thể tự đưa nó vào khuôn khổ Android, hay còn gọi là máy chủ hệ thống, để thực thi. Để kiểm tra khuôn khổ Android, mã kiểm tra có thể gọi các bề mặt chỉ API công cộng, hoặc những người tiếp xúc qua giao diện Android Definition Language AIDL sẵn trong cây nền tảng nguồn. Đối với loại thử nghiệm này, việc nhắm mục tiêu vào bất kỳ gói cụ thể nào là không có ý nghĩa. Do đó, nó phong tục cho instrumentations như vậy phải được khai báo để nhắm mục tiêu gói ứng dụng thử nghiệm riêng của mình, theo quy định tại riêng của mình <manifest> tag của AndroidManifest.xml .

Tùy thuộc vào yêu cầu, các gói ứng dụng thử nghiệm trong danh mục này cũng có thể:

  • Gói các hoạt động cần thiết để kiểm tra.
  • Chia sẻ ID người dùng với hệ thống.
  • Được ký bằng khóa nền tảng.
  • Được biên dịch dựa trên nguồn khung thay vì SDK công khai.

Loại kiểm tra thiết bị đo này đôi khi được gọi là thiết bị đo tự động. Dưới đây là một số ví dụ về các bài kiểm tra tự thiết bị trong nguồn nền tảng:

Ví dụ được đề cập ở đây là viết một thử nghiệm thiết bị đo mới với gói mục tiêu được đặt tại gói ứng dụng thử nghiệm của chính nó. Hướng dẫn này sử dụng bài kiểm tra sau để làm ví dụ:

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

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

Thông thường, nhóm của bạn sẽ có sẵn một mẫu địa điểm để đăng ký mã và các địa điểm để thêm các bài kiểm tra. Hầu hết nhóm sở hữu một kho lưu trữ git duy nhất hoặc chia sẻ một kho lưu trữ với các nhóm khác nhưng có một thư mục con chuyên dụng chứa mã nguồn thành phần.

Giả sử các vị trí gốc cho nguồn thành phần của bạn là <component source root> , hầu hết các thành phần có srctests thư mục dưới nó, và một số tác phẩm khác như Android.mk (hoặc chia thành thêm .mk file), file manifest AndroidManifest.xml , và các tập tin cấu hình thử nghiệm 'AndroidTest.xml'.

Vì bạn đang thêm một thử nghiệm hoàn toàn mới, có thể bạn sẽ cần để tạo ra các tests thư mục bên cạnh thành phần của bạn src , và cư nó với nội dung.

Trong một số trường hợp, nhóm của bạn có thể có cấu trúc thư mục thêm dưới tests do nhu cầu đóng gói dãy khác nhau của các bài kiểm tra vào gói ứng dụng cá nhân. Và trong trường hợp này, bạn sẽ cần phải tạo ra một thư mục phụ mới theo tests .

Bất kể cấu trúc, bạn sẽ kết thúc Populating các tests thư mục hoặc thư mục phụ mới được tạo ra với các tập tin tương tự như những gì trong instrumentation thư mục trong sự thay đổi Gerrit mẫu. Các phần bên dưới sẽ giải thích chi tiết hơn về từng tệp.

Tệp kê khai

Cũng giống như một ứng dụng thông thường, mỗi mô-đun kiểm tra thiết bị đo đạc cần có một tệp kê khai. Nếu bạn đặt tên cho tập tin như AndroidManifest.xml và cung cấp cho nó bên cạnh Android.mk cho mô-đun thử nghiệm của bạn, nó sẽ được tự động bao gồm bởi BUILD_PACKAGE makefile lõi.

Trước khi tiếp tục, nó rất khuyến khích để đi qua các ứng dụng Manifest Tổng quan đầu tiên.

Điều này cung cấp 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 chúng. Xem ví dụ tại platform_testing / kiểm tra / example / thiết bị đo đạc / AndroidManifest.xml .

Một ảnh chụp nhanh được bao gồm ở đây để thuận tiện:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.test.example.helloworld" >

    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />

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

    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                     android:targetPackage="android.test.example.helloworld"
                     android:label="Hello World Test"/>

</manifest>

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.test.example.helloworld" >

Các package thuộc tính là tên gói ứng dụng: đây là định danh duy nhất mà Android sử dụng khung ứng dụng để xác định một ứng dụng (hoặc trong bối cảnh này: ứng dụng thử nghiệm 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 với tên gói đó.

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

Cũng 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 nó thực sự có rất ít thứ liên quan đến nó. Nói cách khác, gói ứng dụng (hoặc gói thử nghiệm) của bạn có thể chứa các lớp với bất kỳ tên gói nào, mặc dù vậy, mặt khác, bạn có thể chọn đơn giản và có tên gói Java cấp cao nhất trong ứng dụng hoặc thử nghiệm giống với tên gói ứng dụng.

android:sharedUserId="android.uid.system"

Điều này tuyên bố rằng tại thời điểm cài đặt, apk này phải được cấp cùng một id người dùng, tức là danh tính thời gian chạy, làm nền tảng cốt lõi. Lưu ý rằng điều này phụ thuộc vào các gói ứng dụng được ký kết với cùng một giấy chứng nhận là nền tảng cốt lõi (xem LOCAL_CERTIFICATE ở phần trên), nhưng họ là những khái niệm khác nhau:

  • một số quyền hoặc API được bảo vệ bằng chữ ký, yêu cầu cùng một chứng chỉ ký
  • một số điều khoản hoặc các API đòi hỏi các system nhận dạng người dùng của người gọi, đòi hỏi các gói gọi để chia sẻ dùng id với system , nếu đó là một gói riêng từ nền tảng cốt lõi bản thân
<uses-library android:name="android.test.runner" />

Điều này là bắt buộc đối với tất cả các bài kiểm tra Instrumentation vì các lớp liên quan được đóng gói trong một tệp thư viện jar khuôn khổ riêng biệt, do đó yêu cầu các mục nhập classpath bổ sung khi gói kiểm tra được gọi bởi khuôn khổ ứng dụng.

android:targetPackage="android.test.example.helloworld"

Bạn có thể nhận thấy rằng các targetPackage đây được khai báo giống như các package thuộc tính khai báo trong manifest tag của tập tin này. Như đã đề cập trong vấn đề cơ bản thử nghiệm , loại này của thử nghiệm thiết bị đo đạc thường được dành cho thử nghiệm API khuôn khổ, do đó, nó không phải là rất có ý nghĩa đối với họ để có một mục tiêu cụ thể gói ứng dụng, khác sau đó chính nó.

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

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

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

Đối với những trường hợp phức tạp hơn, bạn cũng cần phải viết một tập tin cấu hình thử nghiệm cho khai thác thử nghiệm của Android, Liên đoàn thương mại .

Cấu hình thử nghiệm có thể chỉ định các tùy chọn thiết lập thiết bị đặc biệt và các đối số mặc định để cung cấp cho lớp thử nghiệm. Xem ví dụ tại /platform_testing/tests/example/instrumentation/AndroidTest.xml .

Một ảnh chụp nhanh được bao gồm ở đây để thuận tiện:

<configuration description="Runs sample instrumentation test.">
  <target_preparer class="com.android.tradefed.targetprep.TestFilePushSetup"/>
  <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
    <option name="test-file-name" value="HelloWorldTests.apk"/>
  </target_preparer>
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"/>
  <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"/>
  <option name="test-suite-tag" value="apct"/>
  <option name="test-tag" value="SampleInstrumentationTest"/>

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

Một số nhận xét chọn lọc trên tệp cấu hình thử nghiệm:

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

Điều này yêu cầu Trade Federation cài đặt HelloWorldTests.apk vào thiết bị đích bằng target_preparer được chỉ định. Có nhiều trình chuẩn bị mục tiêu có sẵn cho các nhà phát triển trong Trade Federation và chúng có thể được sử dụng để đảm bảo thiết bị được thiết lập đúng cách trước khi thực hiện thử nghiệm.

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

Điều này chỉ định lớp thử nghiệm của Trade Federation để sử dụng để thực hiện thử nghiệm và vượt qua trong gói trên thiết bị được thực thi và khung chạy thử nghiệm là JUnit trong trường hợp này.

Để biết thêm thông tin, xem thử nghiệm module Configs .

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

Sử dụng android-support-test thư viện như Á hậu thử nghiệm cho phép áp dụng các lớp học thử nghiệm phong cách Junit4 mới, và sự thay đổi Gerrit mẫu chứa một số sử dụng rất cơ bản tính năng của nó. Xem ví dụ tại /platform_testing/tests/example/instrumentation/src/android/test/example/helloworld/HelloWorldTest.java .

Mặc dù các mẫu kiểm tra 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.

@RunWith(JUnit4.class)
public class HelloWorldTest {

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

    @BeforeClass
    public static void beforeClass() {
    ...
    @AfterClass
    public static void afterClass() {
    ...
    @Before
    public void before() {
    ...
    @After
    public void after() {
    ...
    @Test
    @SmallTest
    public void testHelloWorld() {
    ...

Các @Before@After chú thích được sử dụng trên các phương pháp bởi Junit4 để thực hiện thiết lập thử nghiệm trước và sau thử nghiệm teardown. Tương tự, @BeforeClass@AfterClass chú thích được sử dụng trên các phương pháp bởi Junit4 để thực hiện thiết lập trước khi thực hiện tất cả các bài kiểm tra trong một lớp học kiểm tra, và teardown sau đó. Lưu ý rằng thiết lập phạm vi lớp và phương thức chia nhỏ phải tĩnh. Đối với các phương pháp kiểm tra, không giống như trong phiên bản trước của JUnit, họ cần có thời gian khởi động tên phương pháp với test , thay vào đó, mỗi người trong số họ phải được chú thích với @Test . Như thường lệ, các phương thức kiểm tra phải công khai, không khai báo giá trị trả về, không nhận tham số và có thể đưa ra các ngoại lệ.

Chú ý: các phương pháp thử nghiệm bản thân được chú thích với @Test chú thích; và lưu ý rằng đối với các bài kiểm tra được thực hiện thông qua APCT, họ phải được chú thích với kích cỡ thử nghiệm: ví dụ chú thích phương pháp testHelloWorld như @SmallTest . Chú thích có thể được áp dụng ở phạm vi phương thức hoặc phạm vi lớp.

Truy cập vào instrumentation

Mặc dù không được đề cập trong ví dụ hello world cơ bản, nó là khá phổ biến cho một thử nghiệm Android để yêu cầu truy cập Instrumentation dụ: đây là giao diện API cốt lõi mà cung cấp truy cập tới bối cảnh ứng dụng, hoạt động chu kỳ liên quan API kiểm tra và nhiều hơn nữa.

Bởi vì Junit4 kiểm tra không còn đòi hỏi một lớp cơ sở chung, nó không còn cần thiết để có được Instrumentation dụ qua InstrumentationTestCase#getInstrumentation() , thay vào đó, các Á hậu kiểm tra mới quản lý nó thông qua InstrumentationRegistry nơi thiết lập ngữ cảnh và môi trường tạo ra bởi khuôn khổ thiết bị đo đạc được lưu trữ.

Để truy cập vào thể hiện của Instrumentation lớp, chỉ cần gọi phương thức tĩnh getInstrumentation() trên InstrumentationRegistry lớp:

Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation()

Xây dựng và thử nghiệm cục bộ

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

Đối với trường hợp phức tạp hơn đòi hỏi tùy biến nặng hơn, hãy làm theo các hướng dẫn thiết bị đo đạc .