Статьи

Как запустить тесты Junit внутри проекта Android

Всем привет!

Сегодня я покажу вам, как создавать и запускать тесты junit внутри вашего проекта Android без создания отдельного тестового проекта. С помощью этих тестов мы быстро сможем автоматизировать и протестировать логику приложения и некоторые простые поведения пользовательского интерфейса. Приведенный ниже пример очень прост и намного более интуитивен, чем другие подходы, которые я видел там.

Определение TestInstrumentation

Прежде всего, определите в своем файле манифеста следующие записи. ВАЖНО! Хотя определение контрольно-измерительной аппаратуры будет размещено вне тега приложения, исполнитель теста должен быть определен внутри тега приложения.

A2  

1
2
3
4
5
6
7
< manifest >
...
< instrumentation
  android:name="android.test.InstrumentationTestRunner"
  android:targetPackage="com.treslines.ponto"
/ >
< / manifest >
1
2
3
4
5
< application >
...
< uses-library android:name="android.test.runner" / >
...
< / application >

Создание тестовых пакетов

Android работает с некоторыми соглашениями во время тестирования. Поэтому крайне важно следовать этим правилам. В противном случае вы получите ошибки компиляции или запуска при попытке запустить его. Одно соглашение состоит в том, что все тесты для определенного класса должны быть помещены в одну и ту же структуру пакета, но с дополнительной подпапкой, называемой test, как вы можете видеть ниже. Поскольку я хочу проверить действия в пакете com.treslines.ponto.activity, я должен создать тестовый пакет с именем com.treslines.ponto.activity.test

A1

Создание самого теста

Это крутая часть этого. Здесь вы можете написать свои тесты Junit как обычно. Опять же, Android дает нам некоторые соглашения для подражания. Все тестовые классы должны иметь то же имя, что и тестируемый класс с суффиксом Test . И все методы тестирования должны начинаться с префиксного теста . Если вы будете следовать этим правилам, все будет хорошо.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// IMPORTANT: All test cases MUST have a suffix "Test" at the end
//
// THAN:
// Define this in your manifest outside your application tag:
//  < instrumentation
//    android:name="android.test.InstrumentationTestRunner"
//    android:targetPackage="com.treslines.ponto"
//  / >
//
// AND:
// Define this inside your application tag:
//  < uses-library android:name="android.test.runner" / >
//
// The activity you want to test will be the "T" type of ActivityInstrumentationTestCase2
public class AlertaActivityTest extends ActivityInstrumentationTestCase2 < AlertaActivity > {
 
 private AlertaActivity alertaActivity;
 private AlertaController alertaController;
 
 public AlertaActivityTest() {
  // create a default constructor and pass the activity class
  // you want to test to the super() constructor
  super(AlertaActivity.class);
 }
 
 @Override
 // here is the place to setup the var types you want to test
 protected void setUp() throws Exception {
  super.setUp();
   
  // because i want to test the UI in the method testAlertasOff()
  // i must set this attribute to true
  setActivityInitialTouchMode(true);
 
  // init variables
  alertaActivity = getActivity();
  alertaController = alertaActivity.getAlertaController();
 }
 
 // usually we test some pre-conditions. This method is provided
 // by the test framework and is called after setUp()
 public void testPreconditions() {
  assertNotNull("alertaActivity is null", alertaActivity);
  assertNotNull("alertaController is null", alertaController);
 }
 
 // test methods MUST start with the prefix "test"
 public void testVibrarSomAlertas() {
  assertEquals(true, alertaController.getView().getVibrar().isChecked());
  assertEquals(true, alertaController.getView().getSom().isChecked());
  assertEquals(true, alertaController.getView().getAlertas().isChecked());
 }
 
 // test methods MUST start with the prefix "test"
 public void testAlertasOff() {
  Switch alertas = alertaController.getView().getAlertas();
  // because i want to simulate a click on a view, i must use the TouchUtils
  TouchUtils.clickView(this, alertas);
  // wait a little (1.5sec) because the UI needs its time
  // to change the switch's state and than check new state of the switches
  new Handler().postDelayed(new Runnable() {
   @Override
   public void run() {
    assertEquals(false, alertaController.getView().getVibrar().isChecked());
    assertEquals(false, alertaController.getView().getSom().isChecked());
   }
  }, 1500);
 }
}

Запуск тестов JUnit

Единственное отличие при запуске junit test в Android состоит в том, что вы будете вызывать Run As> Android JUnit Test, а не просто JUnit Test, как вы привыкли в java.

A3

Вот и все! Надеюсь, вам понравится!