Báo cáo chỉ số hoặc dữ liệu từ kiểm thử Tradefed

Trang này mô tả cách báo cáo các chỉ số cùng với kết quả kiểm thử khi viết một quy trình kiểm thử trong Tradefed.

Lợi ích của việc ghi nhật ký thông qua quy trình Tradefed là tìm thấy các chỉ số cùng với kết quả chức năng. Việc ghi nhật ký các chỉ số có thể được thực hiện một cách rất tự nhiên trong các kiểm thử, giúp người viết kiểm thử thuận tiện hơn khi thêm nhiều hoạt động đo lường.

DeviceTestCase – Kiểu JUnit3

Nếu kiểm thử của bạn mở rộng DeviceTestCase trong một loại kiểm thử theo kiểu JUnit3, bạn có thể gọi phương thức addTestMetric(String key, String value) từ bên trong mọi trường hợp kiểm thử để báo cáo một chỉ số. Bạn có thể gọi phương thức này nhiều lần miễn là khoá là duy nhất.

Ví dụ:

    public static class TestMetricTestCase extends DeviceTestCase {

        public void testPass() {
            addTestMetric("key1", "metric1");
        }

        public void testPass2() {
            addTestMetric("key2", "metric2");
        }
    }

Nếu muốn ghi nhật ký một tệp có trong result_reporters, bạn có thể gọi phương thức addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) từ bên trong mọi trường hợp kiểm thử để báo cáo một tệp cần ghi nhật ký.

Ví dụ:

    public static class TestLogTestCase extends DeviceTestCase {

        public void testPass() {
            try (InputStreamSource source = getDevice().getScreenshot()) {
                addTestLog("screenshot", LogDataType.PNG, source);
            }
        }
    }

TestCase – kiểm thử JUnit3 thông thường

Nếu bạn muốn báo cáo các chỉ số trong Tradefed từ một lớp TestCase JUnit3 thông thường, thì bạn cần chuyển đổi lớp đó thành MetricTestCase. Đây chính là lớp có thêm một phương thức: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner – Kiểu JUnit4

Nếu kiểm thử theo kiểu JUnit4 đang chạy với DeviceJUnit4ClassRunner, thì bạn cũng có thể ghi lại các chỉ số trong một trường hợp kiểm thử (bên trong @Test) để Tradefed báo cáo. Bạn sẽ cần sử dụng các quy tắc TestMetrics để báo cáo các chỉ số của mình.

Ví dụ:

    @RunWith(DeviceJUnit4ClassRunner.class)
    public static class Junit4TestClass {

        @Rule
        public TestMetrics metrics = new TestMetrics();

        @Test
        public void testPass5() {
            // test log through the rule.
            metrics.addTestMetric("key", "value");
        }

        @Test
        public void testPass6() {
            metrics.addTestMetric("key2", "value2");
        }
    }

Để báo cáo tệp, bạn sẽ sử dụng quy tắc TestLogData để báo cáo.

Ví dụ:

    @RunWith(DeviceJUnit4ClassRunner.class)
    public static class Junit4TestClass {

        @Rule
        public TestLogData logs = new TestLogData();

        @Test
        public void testPass5() {
            // test log through the rule.
            try (InputStreamSource source = getDevice().getScreenshot()) {
                logs.addTestLog("screenshot", LogDataType.PNG, source);
            }
        }
    }

IRemoteTest – Kiểm thử Tradefed thuần tuý

Nếu bạn đang viết lớp hoặc trình chạy Kiểm thử Tradefed của riêng mình, bạn sẽ triển khai IRemoteTest và nhận ITestInvocationListener thông qua phương thức run(). Bạn có thể dùng trình nghe này để ghi lại các chỉ số như sau:

    listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);

Bộ thu thập chỉ số Tradefed

Tradefed cung cấp một đối tượng metrics_collector chuyên dụng để thu thập các chỉ số song song với các kiểm thử.

Về phía người tổ chức

Bạn có thể triển khai BaseDeviceMetricCollector để thu thập mọi chỉ số từ phía máy chủ lưu trữ và báo cáo các chỉ số đó trong quá trình gọi kiểm thử. Một số trình thu thập chung đã có sẵn cho nhiều trường hợp sử dụng, nhưng chúng tôi luôn hoan nghênh những đóng góp mới.

Để chỉ định trình thu thập dữ liệu sẽ được dùng trong lệnh gọi Tradefed, bạn chỉ cần thêm đối tượng vào cấu hình Tradefed XML:

Ví dụ:

  <metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
      <option name="categories" value="freq"/>
  </metrics_collector>

Một số bộ sưu tập hiện có: * TemperatureCollector thu thập nhiệt độ định kỳ trong quá trình chạy thử nghiệm. * AtraceCollector thu thập bằng cách sử dụng "atrace" cho từng trường hợp kiểm thử.

Về phía thiết bị

Khi chạy các kiểm thử phía thiết bị (Instrumentations, kiểm thử UIAutomator, v.v.), việc có một trình thu thập ở phía máy chủ lưu trữ thu thập không đồng bộ có thể không phải là lựa chọn lý tưởng. Ví dụ: ảnh chụp màn hình được chụp không đồng bộ sẽ rất có thể bị thiếu màn hình mong muốn và trở nên vô dụng.

Để đáp ứng những trường hợp sử dụng này, một phiên bản phía thiết bị của các bộ sưu tập của chúng tôi tồn tại và có thể được dùng trong mọi hoạt động đo lường "AndroidJUnitRunner". BaseMetricListener có thể được triển khai để tự động báo cáo các chỉ số được thu thập theo cách hoàn toàn tương thích với quy trình báo cáo Tradefed.

Nếu đang sử dụng trình chạy "AndroidJUnitTest" từ Tradefed, bạn chỉ cần chỉ định lựa chọn dòng lệnh sau để trình thu thập dữ liệu chạy cùng với các kiểm thử:

  --device-listeners android.device.collectors.ScreenshotListener

THẬN TRỌNG: Để các lớp trình thu thập được phân giải trong thời gian chạy, APK đo lường của bạn có thể sẽ cần phải tĩnh để đưa các lớp đó vào bằng cách thêm nội dung sau vào tệp makefile:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Chúng tôi cũng hoan nghênh những đóng góp cho các bộ sưu tập phía thiết bị.

Những điểm cần đặc biệt lưu ý đối với phòng suite

Đối với các bộ như CTS có cấu hình cấp cao nhất chạy một số cấu hình mô-đun, bạn không cần chỉ định metrics_collector trong từng cấu hình mô-đun (AndroidTest.xml). Trên thực tế, điều này bị cấm.

Để đảm bảo việc thu thập chỉ số được áp dụng như nhau cho từng mô-đun, chỉ cấu hình cấp cao nhất (ví dụ: cts.xml) mới có thể chỉ định metrics_collector như đã giải thích ở trên. Các trình thu thập này sẽ được áp dụng và chạy trên từng mô-đun của bộ ứng dụng.

Thu thập tệp nhật ký thiết bị từ một mô-đun

Có một chế độ thiết lập để kiểm thử phía thiết bị thông báo rằng bạn nên thu thập một số tệp.

AndroidTest.xml có thể chỉ định một trình thu thập sẽ tìm kiếm tệp trên thiết bị và kéo các tệp đó.

  <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
      <!-- repeatable: Pattern of key of a FILE we listen on that should be pulled -->
      <option name = "pull-pattern-keys" value = "ScreenshotListener_.*" />

      <!-- repeatable: The key of the DIRECTORY to pull -->
      <option name = "directory-keys" value = "<example-key: /sdcard/atrace_logs>" />
  </metrics_collector>

Bằng cách chỉ định các mẫu và khoá này, nếu thấy khoá, trình thu thập sẽ cố gắng kéo và ghi nhật ký tệp được liên kết.

Để các khoá này được tạo, một kiểm thử phía thiết bị (instrumentation) phải chỉ định tệp cần được ghi nhật ký. Việc này được thực hiện theo cách tương tự như phía máy chủ lưu trữ (được mô tả ở trên).

  1. Thêm collector-device-lib vào APK kiểm thử trong các tệp make:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Sử dụng @rule mà chúng tôi cung cấp cho tệp nhật ký:
    @RunWith(AndroidJUnit4.class)
    public static class Junit4TestClass {

        @Rule
        public TestLogData logs = new TestLogData();

        @Test
        public void testPass5() {
            // test log through the rule.
            File logFile = new File("whatever");
            logs.addTestLog("KEY", logFile);
        }
    }

Tên KEY trong ví dụ trên là tên mà tệp sẽ được báo cáo. Đây là tên bạn nên khớp trong FilePullerDeviceMetricCollector để tự động kéo tên đó. Tên này phải là tên duy nhất.

LƯU Ý: Sau khi tệp được kéo, FilePullerDeviceMetricCollector sẽ tự động xoá tệp đó khỏi thiết bị.

Tôi có thể tìm thấy các chỉ số ở đâu?

Việc này phụ thuộc vào result_reporter được chỉ định trong cấu hình XML.