Рубрики
Без рубрики

Простая и понятная архитектура для проверки теста JavaScript

Простая архитектура, которую вы можете легко протестировать и поддерживать приложения JavaScript.

Автор оригинала: Aaron Gerard Franco.

Разработка тестирования (TDD) – это процесс тестирования кода, прежде чем он написан. Разработчик находит проблему, подходит с решением, а затем записывает тест для проверки этого решения. Этот тест, конечно, не удается, поэтому разработчик будет писать код, который может пройти этот тест. Этот процесс продолжается до тех пор, пока программное обеспечение не будет завершено. Скажем, например, что нам нужно написать функцию, которая итерации на массив. Если элементы в массиве не превышают значения «X», то функция возвращает false. В противном случае он возвращает true.

TDD JavaScript Test Driving Development

После принципов TDD начинаются с пустой функции:

function arrayValueFunction(x, array) {
  return null;
}

Чтобы проверить функцию, мы бы написали следующий тест:

describe("The arrayValueFunction ", function() {

   // test that it returns true
   it("returns true if any value in the Array is greater than X", function() {
     var array = [1, 2, 3, 4];
     var result = arrayValueFunction(2, array);
     expect(result).toBe(true);
   }

   // test that it returns false
   it("returns false if no value in the Array is greater than X", function() {
      var array = [1, 2, 3, 4];
      var result = arrayValueFunction(5, array);
      expect(result).toBe(false);
   }

}

Оба эти тесты не удаются, потому что наша функция пуста и возвращает «нуль». Поэтому нам нужно написать функцию, чтобы пройти тесты.

function arrayValueFunction(x, array) {
  var current_value = 0;
  for(var i=0; i x){
       return true;
     }
  }
  return false;
}

Это основная основа TDD. Тем не менее, многие разработчики не следят за этим процессом. Вместо этого они пишут тесты после того, как они пишет свой код, чтобы удовлетворить требования проекта. Некоторые из них даже не пишут тесты.

TDD предназначен для того, чтобы помочь вам подумать о структуре вашей программы. Мы проектируем тесты вокруг того, как мы хотели бы разработать наше программное обеспечение. TDD заставляет вас в парадигме итерации и рефакторинга, помогая вам лучше сделать ваш код каждый раз, когда вы пишете тест. Это также помогает вам подумать о лучшем способе написать тест на код, который вы собираетесь написать. Это все преимущества, которые теряются, если вы пишете свой код, прежде чем писать тесты. Написывая тесты сначала, они не будут написаны с намерением передать код, который уже там. Тесты могут быть смещены в сторону кода, если код уже существует. Поэтому, пожалуйста, напишите свои тесты в первую очередь. Это сделает вас лучшим программистом и позволит вам построить лучшее программное обеспечение.

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

Маленькая структура – это все, что вам нужно!

Допустим, нам нужно построить интернет, подключенный «собачий». Когда воротник Bluetooth Le (Ibeacon) Bluetooth Le (Ibeacon) соединяется с дверью, дверь откроется через 30 секунд. Когда воротник отключается, дверь закрывается. С целью этого примера мы будем смотреть на логику только для управления открытием и закрытием собачьей двери.

Код

// JavaScript Code

var connected = false;
var doorOpen = false;
var timer = null;

// assume these are real things - NOT REAL! :)
var door = new DoggyDoor();
var collar = new CollarListener();

var app = {
   init:function(){

      collar.onConnect = function(data){ 
          connected = true;         

          setInterval(function(evt){
       
             if( connected && !doorOpen){
               door.open();
               doorOpen = true;
               clearInterval(timer);
             }     

          }, 30000);

      }

      collar.onDisconnect = function(data){

          clearInterval(timer);

          connected = false;
     
          if(doorOpen) {
             door.close();
             doorOpen = false;

          }

      }
  }
}

// start the program
app.init();

ПРИМЕЧАНИЕ. Я предполагаю, что «собачья дверь» и «слушатель воротника» – это фактические программы в реальном мире. ОНИ НЕ! Они поддельные примеры ☺

Этот пример код не очень удобный для тестирования из-за того, что в коде не существует разделения обязанностей. Разработчики исправит это с объектом ориентацией и принципами проектирования программного обеспечения. Однако это не так, как хакеры думают. Хакеры реализуют код и надежду (иногда знают) это будет работать. Как только это закодировано, они бегут. Если это сломается, они делают необходимые изменения и снова запускают его. Проблема в том, что этот хакерский подход не работает для разработки на основе команды или разработки программного обеспечения предприятия. Решение состоит в том, чтобы подумать о задачах, которые ваш код должен выполнять и изолировать каждую задачу в функции. Это самый быстрый способ написания тестируемого кода. Давайте перейдем на приведенный выше пример, чтобы сделать его «оспорить».

Структурированный код

// JavaScript Code
var connected = false;
var doorOpen = false;
var timer = false;

// assume these are real things - NOT REAL! :)
var door = new DoggyDoor();
var collar = new CollarListener();

var app = {
   init:function(){
      collar.onConnect = app.handleCollarConnect;
      collar.onDisconnect = app.handleCollarDisconnect;
   },
   handleCollarConnect:function(data){
      connected = true;
      manageTimer();
   },
   handleCollarDisconnect:function() {
      connected = false;
      openCloseDoor();
      clearInterval(timer); // manually clear timer
      timer = false;
   },
   onTimerTick:function(evt) {  
      openCloseDoor();
      manageTimer();
   },
   manageTimer:function() {
      if(!timer){
           timer = setInterval(onTimerTick, 30000);
      }else{
           clearInterval(timer);
      }
   },
   openCloseDoor:function(){
      if(connected && !doorOpen){
         door.open();
         doorOpen = true;
      }else{
         door.close();
         doorOpen = false;
      }
   }
}

// start the program
app.init();

Теперь, когда у нас есть этот хорошо структурированный код (который можно улучшить), нам легко писать тесты для него! Также очень проще читать.

describe("The app", function() {

   // test that it returns true
   it(" connects to a collar and waits 30 seconds to open the door.", function() {
     app.handleCollarConnect();
     setInterval(function(){
        expect(app.connected).toBe(true);
        expect(app.doorOpen).toBe(true);
     }, 30000)
   }

   // test that it returns false
   it(" clears the timer and closes the door on collar disconnect", function() {
      app.handleCollarDisconnect();
      expect(app.connected).toBe(false)
      expect(app.doorOpen).toBe(false);
   }
   
   it(" can close the open door", function() {
      app.door.open();
      app.doorOpen = true;
      app.connected = false;
      app.openCloseDoor()  
      expect(app.doorOpen).toBe(false);
   }
   
   it(" can open the closed door", function() {
      app.door.close();
      app.doorOpen = false;
      app.connected = true;
      app.openCloseDoor();
      expect(app.doorOpen).toBe(true);
   }

}

Тесты тщательно описывают нашу программу, и программа легко читать. Этот код будет легким в создании или рефакторе в более надежную структуру. Отлично начать строить лучшее программное обеспечение.

Почему тестируемое развитие?

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

Отделите свой код в функции, которые несут ответственность за отдельные задачи и постарайтесь не повторять себя.

Вы также должны попытаться написать тесты перед записью кода или, по крайней мере, доставляйте проверенный код.

Заключение

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

Если вы хотели бы узнать больше о TDD на других языках, прочитайте, как (наконец) учиться разработку тестирования для Ruby на рельсах и модульном тестировании и TDD в Node.js – часть 1 и тестирование единиц и TDD в Node.js – Часть 2 для Node.js.

Вы также можете Проверьте живой пример на GitHub!

Живой пример построен в виде модуля Node.js, а объекты Doggydoor и воротника – это простые заглушки. Он использует Nodeunit Framework для тестирования выполнения. Это совершенно другой синтаксис, чем указанный выше примера, но структура одинакова, и все испытания проходят.