Наша компания «RTL Service» занимается разработкой системы локального позиционирования, с помощью которой можно точно определить, где в помещении находится определенный человек. Помимо этого, наша система позволяет связаться с этим человеком с помощью собственных коммуникаторов (рисунок 1) по защищенному каналу связи.


Рис. 1 — коммуникатор

Я — инженер отдела тестирования, и в мои обязанности входит проверка того, чтобы прошивка и начинка наших коммуникаторов верно отрабатывали всевозможные комбинации нажатия и зажатия клавиш. Раньше это делалось вручную и занимало немало времени и сил (под конец пальцы уже не хотели слушаться). Поэтому, было принято решение заменить человеческий труд на автоматическое тестирование с помощью железяк.

В качестве тестировщика была выбрана плата Arduino UNO. Она достаточно проста и удобна в использовании, имеет встроенный микроконтроллер ATMega328, 14 цифровых входов/выходов (при чем 6 из них могут использоваться как выходы ШИМ), кварцевый генератор на 16 МГц и разъем USB.

Итак, приступим.

Плата кнопок подключается по шлейфу к плате коммуникатора. В шлейфе присутствует четыре линии, три из которых отвечают за 3 кнопки, и четвертая отвечает за землю. Для тестирования была сделана своя платка для подключения разъема кнопок коммуникатора (рис. 2) к Arduino. На ней присутствует, соответственно, шлейф для подключения к плате устройства связи, 4 провода на пины контроллера и оптопары, чтобы отвязать кнопки от земли.


Рис. 2 – плата соединения


Рис.3 – как всё это выглядит

Далее дело за программой.

У коммуникатора есть 3 кнопки: кнопка запроса среды/ответа, кнопка смены канала, на котором будет производиться связь, кнопка включения/выключения устройства. Также, например, одновременное зажатие нижней и верхней кнопок приводит к увеличению громкости коммуникатора, а зажатие нижней и средней – к уменьшению.

Чтобы нажать какую-либо кнопку, нужно послать на соответствующий пин 5 В (т.е. перевести пин в состояние HIGH). Таким образом, чтобы её отпустить, нужно перестать подавать 5 В (перевести в состояние LOW). Например, функция включения устройства:
void switching(){ 
    Serial.println("ON/OFF");
    delay(70);
    digitalWrite(low_button, HIGH);
    delay(7000);
    digitalWrite(low_button, LOW);
    delay(500); 
  };

В этой функции на пин, отвечающий за нижнюю кнопку, в течение 7 секунд (соответствует времени включения/выключения устройства связи) посылается 5 В. После этого, посылается 0 В, что означает отжатие клавиши.

Примерно таким же образом можно реализовать и процесс зажатия одной клавиши и нажатия/зажатия в этот момент другой:
void buttDelay_Press(int pin_1, int pin_2){
    digitalWrite(pin_1, HIGH);
    delay(100);
    buttPress(1, pin_2,0,0,10);//press button
    buttPress(1, pin_2,0,0,60);
    digitalWrite(pin_2, HIGH); delay(10000); 									
    digitalWrite(pin_2, LOW);
    if (pin_2 == low_button )
      {
        switching();
        }
        
    digitalWrite(pin_2, HIGH);
    tDelay(60000); //change pin status to LOW
    if (pin_2 == low_button )
      {
        switching();
        } 
    };

В этой функции зажимается кнопка pin_1. В этот же момент времени нажимается кнопка pin_2 10 и 60 раз подряд, после чего зажимается на 10 и 60 секунд. Помимо этого, здесь присутствует проверка на зажатие нижней кнопки. Выше было указано, что при зажатии этой кнопки более 7 секунд коммуникатор выключается/включается, следовательно, если это происходит, устройство нужно вернуть в исходное состояние.

Присутствуют и случайные нажатия и зажатия клавиш:
 // Random pressing
  void buttRandPress(int ncount){
    for (int i = 0; i < ncount; i++) {
    rbutton = buttons[random(3)];
    buttPress(1, rbutton,0,0, 1);
    }
  };
  
  // Random holding
   void buttRandDelay(int ncount, int dtime){
    for (int i = 0; i < ncount; i++) {
      rbutton = buttons[random(3)];
      buttDelay(1, rbutton,0,0);
      tDelay(dtime);
    }
   };

В этих функциях случайным образом выбирается одна из трех кнопок, которая нажимается или зажимается на случайное время.

В тестах также проверяется и зажатие всех клавиш. Проверяются все комбинации с разными задержками между нажатиями, потому что и такое в жизни бывает.

Дополнительная преимущество такого автотеста в отличие от ручного состоит в том, что устройство можно оставить на несколько дней непрерывной работы, освободив человека для других задач. Таким образом, можно проверить стабильность коммуникатора при непрерывной нагрузке.

С помощью предложенного выше способа можно тестировать и другие устройства. Например, можно сымитировать неожиданный сброс по питанию и посмотреть, как быстро устройство включится в сеть.

В следующей публикации мы планируем рассказать об организации стресс-тестирования сервера, о реализации внешней и внутренней нагрузки на сервер, о метриках, которые мы используем для проверки адекватности работы сервера под нагрузкой.

Автор: Федор Талаев

Комментарии (5)


  1. GarryC
    22.04.2016 10:23

    Вы уверены, что это тестирование устройств, а не программного обеспечения?


  1. RTL-Service
    22.04.2016 11:03

    Да, это тестирование именно устройства


    1. GarryC
      22.04.2016 17:38

      То есть при тестировании конкретного устройства вы проверяете реакцию на каждое сочетание клавиш?
      Мне почему то кажется, что было бы достаточно проверить принципиальную нажимаемость клавиш по одной, хотя, конечно, у Вас может быть более сложный случай в смысле аппаратуры.


  1. IronHead
    22.04.2016 12:45

    Расскажите лучше про ваш коммуникатор. Какое шифрование применяется(ГОСТ или нет?), какое железо шифрует трафик и тд. Про это будет гораздо интереснее прочитать.


    1. RTL-Service
      25.04.2016 09:55

      Одна из следующих статей планируется именно на эту тему.