SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
ТЕСТИРОВАНИЕ
                            JAVASCRIPT КОДА




Wednesday, January 30, 13
Зачем тестировать javascript?




 Мы пишем рабочий код, зачем нам писать еще
 какие то тесты?!

 Тестировщики и так тестируют функционал!



Wednesday, January 30, 13
Код без тестирования




Wednesday, January 30, 13
Код покрытый тестами




Wednesday, January 30, 13
Писать тесты круто!




Wednesday, January 30, 13
Писать тесты необходимо

     1. инструкция для вашего кода (документация)
     2. уверенность в вашем коде и завтрашнем дне
     3. эволюция разработчика
     4. рефакторинг без страха




Wednesday, January 30, 13
Подходы

                            TDD                                     BDD
   Описывает юнит, с точки зрения его            Описывает поведение юнита (модуля), как он
   функциональности                              должен себя вести

   Думаете как работает код.                     Эволюция TDD под требования бизнеса, когда
                                                 надо говорить о поведении, а не о коде.
   describe('#indexOf()', function(){            Это значит, что надо думать не функциями и
        it('should return -1 when the value is   возвращаемыми значениями, а поведением
   not present', function(){                     тестируемой сущности
           assert.equal(-1, [1,2,3].indexOf(5));
           assert.equal(-1, [1,2,3].indexOf(0));
                                                 describe('#indexOf()', function(){
        })
                                                      it('should return -1 when the value is
     })
                                                 not present', function(){
                                                         [1,2,3].indexOf(5).should.equal(-1);
                                                         [1,2,3].indexOf(0).should.equal(-1);
                                                      })
                                                   })




Wednesday, January 30, 13
Какой код можно покрыть тестами?


 • Код  должен быть модульным, а не монолитным.
     Мы пишем тесты для юнита
 • Слабая                   связанность между компонентами
 • Один    юнит должен решать одну задачу. Ведем
     разработку методом “Разделяй и влавствуй”
 • Тестируем поведение. Нужен контрольный пример
     идеального поведения



Wednesday, January 30, 13
Как писать тесты? Теория BDD.
    • Пишем                 тест, смотрим чтобы тест запускался

    • Пишем                 код.

    • Запускаем                тест

    • Дорабатываем                    код, чтобы тест был пройден




Wednesday, January 30, 13
Как писать тесты? Теория BDD. Дополнение

    • Не    весь код надо покрывать тестами. Определяем что
        тестируем, а что не тестируем.

    • Сложные   юниты, связанные с другими юнитами, тестируем
        методом декомпозиции снизу вверх. Те тестируем
        обособленные юниты, а потом общий юнит.




Wednesday, January 30, 13
Инструментарий

                             Нужно: Test runner и test framework

    • Jasmine               BDD testing framework

    • Jasmine-jQuery               (помощь для DOM testing)

    • SinonJS: spies, mock, fixtures, fakeServer

    • TestAcular              или Testem (test runner)

    • PhantomJS                (или любой другой браузер)

    • NodeJS                (для запуска JS-кода)

Wednesday, January 30, 13
Порядок установки


    • NodeJS                (windows/linux/mac)

    • PhantomJS               (windows/linux/mac)

    • npm           -g install testacular (jasmine уже встроен)

    • скачиваем               jasmine-jquery, sinonjs

    • npm           -g install coffee-script (удобней писать тесты)

    • настраиваем                конфиг testacular



Wednesday, January 30, 13
Конфигурируем TestAcular

    • basePath               = “./” - где находятся все файлы.

    • files            = [“.*coffee”, “jquery.js” ....] - зависимости, тесты, код

    • reporters              = [“dots”] - формат отчета

    • port             = 9090 - где запускается сервер

    • autoWatch                = false - отключаем мониторинг файлов

    • browsers     = [“PhantomJS”, “Chrome” ...] - в каких
        браузерах запускать тесты

    • preprocessors                = {“**/*.coffee” : “coffee”}

Wednesday, January 30, 13
Запускаем из консоли




Wednesday, January 30, 13
Настраиваем запуск в IntelliJ IDEA




Wednesday, January 30, 13
Запуск в IntelliJ Idea




Wednesday, January 30, 13
CoffeeScript minimal skills
                            javascript             coffeescript
      function test( ) { }               test = ->
      function test(a, b, c){ }          test = (a, b, c) ->
      a = {key: “value”}                 a = key : “value”

      test( )                            test( )

      test(a, b, c)                      test a, b, c

      function( ){ }.bind(this)          ( )=>

      test.prototype.name                test::name

      this.name                          @name
Wednesday, January 30, 13
CoffeeScript minimal skills

    Block Strings
    html = """
           <div class=”test”>
             cup of <strong>coffeescript</strong>
           </div>
           """




Wednesday, January 30, 13
Jasmine BDD
   suites
   describe("A suite", function() {
     it("contains spec with an expectation", function() {
       expect(true).toBe(true);
     });
   });



    Test
    describe("A suite is just a function", function() {
      var a;

         it("and so is a spec", function() {
           a = true;

        expect(a).toBe(true);
      });
    });




Wednesday, January 30, 13
Matchers

      •   toBe - сравнение

      •   toEqual - тождество

      •   toMatch - регулярка

      •   toBeDefined / toBeUndefined - существование

      •   toBeNull

      •   toBeTruthy - истина

      •   toBeFalsy - ложь

      •   toContain - содержит

      •   not.toBe / not.toBeDefined / not.toBeUndefined / not.toBeNull ..... отрицание


Wednesday, January 30, 13
Jasmine. example case 1

   describe "my first test case", ->
   	

 it "test trythy", ->
   	

 	

   expect(true).toBeTruthy()
   	

 	

   	

 it "test equal", ->
   	

 	

   expect(1).toEqual 1
   	

 	

   	

 it "test null", ->
   	

 	

   expect(null).toBeNull()
   	

 	

   	

 it "test defined", ->
   	

 	

   b = 100
   	

 	

   expect(b).not.toBeUndefined()
   	

 	

   	

 it "test contain", ->
   	

 	

   expect("bar").toContain "b"
   	

 	

   expect("bar").not.toContain "z"




Wednesday, January 30, 13
Jasmine. Setup and Teardown


    beforeEach - инициализация ресурсов и выполнение
    действий необходимых для каждого теста

    afterEach - освобождение ресурсов и выполнение
    действий после каждого теста




Wednesday, January 30, 13
Jasmine. Spies.

  Когда не важен результат функции, а важен лишь факт ее
  вызова на помощь приходят шпионы!
  spyOn - создаем шпиона
  toHaveBeenCalled - вызывался ли он
  toHaveBeenCalledWith - вызывался с аргументами
  andCallFake - говорим, чтобы вызвал нашу функцию
  вместо стандартной




Wednesday, January 30, 13
Jasmine. Spies


 Для тестирования сложных юнитов, можно создавать
 fake objects имитирующих поведение реальных
 объектов

  createSpyObj - создает объект с указанными
  фейковыми свойствами




Wednesday, January 30, 13
Jasmine. Async tests

   Для тестирования функций, которые выполняются
   асинхронно необходим особый подход
  waitFor - ждем указанное время. Возвращает
  Boolean, который говорит о прохождении теста, либо
  fail при окончании указанного промежутка времени
  runs - выполнение инструкций. Зависит от waitFor


    Анимации, таймауты, ajax и тд и тп.




Wednesday, January 30, 13
SinonJS. или как тестировать ajax requests, mocks



  • stubs           - подменяет вызов функции

  • useFakeXMLHttpRequest            - подменяет нативный request на
      фейковый

  • fakeServer (.create/.restore) - создает фэйковый сервер и
      проксирует через него все запросы




Wednesday, January 30, 13
sinon.fakeServer.create()


    1. создаем сервер server = sinon.fakeServer.create( )
    2. добавляем мапинг запросов server.respondWith
    3. делаем запрос $.get
    4. отдаем запрос фейковым сервером server.respond( )




Wednesday, January 30, 13
Тестирование DOM.


  1. тестировать все не нужно. Достаточно проверить
  наличие элемента и его атрибуты

  2. Создаем html fixture: переменная или test page

  3. перед каждым тестом вставляем его в DOM

  4. после каждого теста очищаем DOM




Wednesday, January 30, 13
Спасибо за внимание!




Wednesday, January 30, 13

Mais conteúdo relacionado

Mais procurados

работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
metaform
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Sergey Nemchinsky
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 

Mais procurados (16)

Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.
 
JRebel
JRebelJRebel
JRebel
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 

Destaque

實踐研討會
實踐研討會實踐研討會
實踐研討會
豊儒 駱
 
4 q07 financial and operating results presentation
4 q07 financial and operating results presentation4 q07 financial and operating results presentation
4 q07 financial and operating results presentation
Equatorial
 
мэндбаяр гимнастик5р анги
 мэндбаяр гимнастик5р анги мэндбаяр гимнастик5р анги
мэндбаяр гимнастик5р анги
mendbayr79
 
Jamie beck fotok+ani
Jamie beck fotok+aniJamie beck fotok+ani
Jamie beck fotok+ani
VarganeAnny
 
Igor zenin fotoalbum(3)+ani (nx power lite)
Igor zenin fotoalbum(3)+ani (nx power lite)Igor zenin fotoalbum(3)+ani (nx power lite)
Igor zenin fotoalbum(3)+ani (nx power lite)
VarganeAnny
 
Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)
Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)
Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)
VarganeAnny
 
健走比慢跑好
健走比慢跑好健走比慢跑好
健走比慢跑好
chengchunhao
 
аз и числата 2
аз и числата 2аз и числата 2
аз и числата 2
SLAVEEVA
 
01 clasificacion del recien nacido u.a. - 2013
01 clasificacion del recien nacido   u.a. - 201301 clasificacion del recien nacido   u.a. - 2013
01 clasificacion del recien nacido u.a. - 2013
Pablo María Peralta Lorca
 
Amelia Elsbree Portfolio
Amelia Elsbree PortfolioAmelia Elsbree Portfolio
Amelia Elsbree Portfolio
aelsbree
 
Modern art(2)+ani (nx power lite)
Modern art(2)+ani (nx power lite)Modern art(2)+ani (nx power lite)
Modern art(2)+ani (nx power lite)
VarganeAnny
 

Destaque (20)

Teste comsom
Teste comsomTeste comsom
Teste comsom
 
實踐研討會
實踐研討會實踐研討會
實踐研討會
 
4 q07 financial and operating results presentation
4 q07 financial and operating results presentation4 q07 financial and operating results presentation
4 q07 financial and operating results presentation
 
Il risveglio del signor W
Il risveglio del signor WIl risveglio del signor W
Il risveglio del signor W
 
Technologies for learning
Technologies for learningTechnologies for learning
Technologies for learning
 
мэндбаяр гимнастик5р анги
 мэндбаяр гимнастик5р анги мэндбаяр гимнастик5р анги
мэндбаяр гимнастик5р анги
 
Jamie beck fotok+ani
Jamie beck fotok+aniJamie beck fotok+ani
Jamie beck fotok+ani
 
Igor zenin fotoalbum(3)+ani (nx power lite)
Igor zenin fotoalbum(3)+ani (nx power lite)Igor zenin fotoalbum(3)+ani (nx power lite)
Igor zenin fotoalbum(3)+ani (nx power lite)
 
Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)
Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)
Házi múzeum,pierre auguste renoir(2)+ani (nx powerlite)
 
新北教會一週年回顧PPT
新北教會一週年回顧PPT新北教會一週年回顧PPT
新北教會一週年回顧PPT
 
健走比慢跑好
健走比慢跑好健走比慢跑好
健走比慢跑好
 
Neoplasias
NeoplasiasNeoplasias
Neoplasias
 
Kerékpárosklub keecskeméti Tsz. problémabemutató
Kerékpárosklub keecskeméti Tsz. problémabemutatóKerékpárosklub keecskeméti Tsz. problémabemutató
Kerékpárosklub keecskeméti Tsz. problémabemutató
 
Kocse laszlo
Kocse laszloKocse laszlo
Kocse laszlo
 
аз и числата 2
аз и числата 2аз и числата 2
аз и числата 2
 
Chemung Landfill Expansion - The Facts
Chemung Landfill Expansion - The FactsChemung Landfill Expansion - The Facts
Chemung Landfill Expansion - The Facts
 
01 clasificacion del recien nacido u.a. - 2013
01 clasificacion del recien nacido   u.a. - 201301 clasificacion del recien nacido   u.a. - 2013
01 clasificacion del recien nacido u.a. - 2013
 
Amelia Elsbree Portfolio
Amelia Elsbree PortfolioAmelia Elsbree Portfolio
Amelia Elsbree Portfolio
 
Send care to a place for sdc2013
Send care to a place for sdc2013Send care to a place for sdc2013
Send care to a place for sdc2013
 
Modern art(2)+ani (nx power lite)
Modern art(2)+ani (nx power lite)Modern art(2)+ani (nx power lite)
Modern art(2)+ani (nx power lite)
 

Semelhante a Javascript testing

Эльдар Марков
Эльдар МарковЭльдар Марков
Эльдар Марков
alarin
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
Krivoy Rog IT Community
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDays
LiloSEA
 

Semelhante a Javascript testing (20)

JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
 
Распределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на JavaРаспределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на Java
 
Spock - the next stage of unit testing
Spock - the next stage of unit testingSpock - the next stage of unit testing
Spock - the next stage of unit testing
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
Эльдар Марков
Эльдар МарковЭльдар Марков
Эльдар Марков
 
BDD
BDDBDD
BDD
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненавистиQA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
 
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья СтусьПолный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
 
Rambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOS
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDays
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
 
Unit тесты java
Unit тесты javaUnit тесты java
Unit тесты java
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
UI+unit testing in iOS
UI+unit testing in iOSUI+unit testing in iOS
UI+unit testing in iOS
 

Javascript testing

  • 1. ТЕСТИРОВАНИЕ JAVASCRIPT КОДА Wednesday, January 30, 13
  • 2. Зачем тестировать javascript? Мы пишем рабочий код, зачем нам писать еще какие то тесты?! Тестировщики и так тестируют функционал! Wednesday, January 30, 13
  • 6. Писать тесты необходимо 1. инструкция для вашего кода (документация) 2. уверенность в вашем коде и завтрашнем дне 3. эволюция разработчика 4. рефакторинг без страха Wednesday, January 30, 13
  • 7. Подходы TDD BDD Описывает юнит, с точки зрения его Описывает поведение юнита (модуля), как он функциональности должен себя вести Думаете как работает код. Эволюция TDD под требования бизнеса, когда надо говорить о поведении, а не о коде. describe('#indexOf()', function(){ Это значит, что надо думать не функциями и it('should return -1 when the value is возвращаемыми значениями, а поведением not present', function(){ тестируемой сущности assert.equal(-1, [1,2,3].indexOf(5)); assert.equal(-1, [1,2,3].indexOf(0)); describe('#indexOf()', function(){ }) it('should return -1 when the value is }) not present', function(){ [1,2,3].indexOf(5).should.equal(-1); [1,2,3].indexOf(0).should.equal(-1); }) }) Wednesday, January 30, 13
  • 8. Какой код можно покрыть тестами? • Код должен быть модульным, а не монолитным. Мы пишем тесты для юнита • Слабая связанность между компонентами • Один юнит должен решать одну задачу. Ведем разработку методом “Разделяй и влавствуй” • Тестируем поведение. Нужен контрольный пример идеального поведения Wednesday, January 30, 13
  • 9. Как писать тесты? Теория BDD. • Пишем тест, смотрим чтобы тест запускался • Пишем код. • Запускаем тест • Дорабатываем код, чтобы тест был пройден Wednesday, January 30, 13
  • 10. Как писать тесты? Теория BDD. Дополнение • Не весь код надо покрывать тестами. Определяем что тестируем, а что не тестируем. • Сложные юниты, связанные с другими юнитами, тестируем методом декомпозиции снизу вверх. Те тестируем обособленные юниты, а потом общий юнит. Wednesday, January 30, 13
  • 11. Инструментарий Нужно: Test runner и test framework • Jasmine BDD testing framework • Jasmine-jQuery (помощь для DOM testing) • SinonJS: spies, mock, fixtures, fakeServer • TestAcular или Testem (test runner) • PhantomJS (или любой другой браузер) • NodeJS (для запуска JS-кода) Wednesday, January 30, 13
  • 12. Порядок установки • NodeJS (windows/linux/mac) • PhantomJS (windows/linux/mac) • npm -g install testacular (jasmine уже встроен) • скачиваем jasmine-jquery, sinonjs • npm -g install coffee-script (удобней писать тесты) • настраиваем конфиг testacular Wednesday, January 30, 13
  • 13. Конфигурируем TestAcular • basePath = “./” - где находятся все файлы. • files = [“.*coffee”, “jquery.js” ....] - зависимости, тесты, код • reporters = [“dots”] - формат отчета • port = 9090 - где запускается сервер • autoWatch = false - отключаем мониторинг файлов • browsers = [“PhantomJS”, “Chrome” ...] - в каких браузерах запускать тесты • preprocessors = {“**/*.coffee” : “coffee”} Wednesday, January 30, 13
  • 15. Настраиваем запуск в IntelliJ IDEA Wednesday, January 30, 13
  • 16. Запуск в IntelliJ Idea Wednesday, January 30, 13
  • 17. CoffeeScript minimal skills javascript coffeescript function test( ) { } test = -> function test(a, b, c){ } test = (a, b, c) -> a = {key: “value”} a = key : “value” test( ) test( ) test(a, b, c) test a, b, c function( ){ }.bind(this) ( )=> test.prototype.name test::name this.name @name Wednesday, January 30, 13
  • 18. CoffeeScript minimal skills Block Strings html = """ <div class=”test”> cup of <strong>coffeescript</strong> </div> """ Wednesday, January 30, 13
  • 19. Jasmine BDD suites describe("A suite", function() { it("contains spec with an expectation", function() { expect(true).toBe(true); }); }); Test describe("A suite is just a function", function() { var a; it("and so is a spec", function() { a = true; expect(a).toBe(true); }); }); Wednesday, January 30, 13
  • 20. Matchers • toBe - сравнение • toEqual - тождество • toMatch - регулярка • toBeDefined / toBeUndefined - существование • toBeNull • toBeTruthy - истина • toBeFalsy - ложь • toContain - содержит • not.toBe / not.toBeDefined / not.toBeUndefined / not.toBeNull ..... отрицание Wednesday, January 30, 13
  • 21. Jasmine. example case 1 describe "my first test case", -> it "test trythy", -> expect(true).toBeTruthy() it "test equal", -> expect(1).toEqual 1 it "test null", -> expect(null).toBeNull() it "test defined", -> b = 100 expect(b).not.toBeUndefined() it "test contain", -> expect("bar").toContain "b" expect("bar").not.toContain "z" Wednesday, January 30, 13
  • 22. Jasmine. Setup and Teardown beforeEach - инициализация ресурсов и выполнение действий необходимых для каждого теста afterEach - освобождение ресурсов и выполнение действий после каждого теста Wednesday, January 30, 13
  • 23. Jasmine. Spies. Когда не важен результат функции, а важен лишь факт ее вызова на помощь приходят шпионы! spyOn - создаем шпиона toHaveBeenCalled - вызывался ли он toHaveBeenCalledWith - вызывался с аргументами andCallFake - говорим, чтобы вызвал нашу функцию вместо стандартной Wednesday, January 30, 13
  • 24. Jasmine. Spies Для тестирования сложных юнитов, можно создавать fake objects имитирующих поведение реальных объектов createSpyObj - создает объект с указанными фейковыми свойствами Wednesday, January 30, 13
  • 25. Jasmine. Async tests Для тестирования функций, которые выполняются асинхронно необходим особый подход waitFor - ждем указанное время. Возвращает Boolean, который говорит о прохождении теста, либо fail при окончании указанного промежутка времени runs - выполнение инструкций. Зависит от waitFor Анимации, таймауты, ajax и тд и тп. Wednesday, January 30, 13
  • 26. SinonJS. или как тестировать ajax requests, mocks • stubs - подменяет вызов функции • useFakeXMLHttpRequest - подменяет нативный request на фейковый • fakeServer (.create/.restore) - создает фэйковый сервер и проксирует через него все запросы Wednesday, January 30, 13
  • 27. sinon.fakeServer.create() 1. создаем сервер server = sinon.fakeServer.create( ) 2. добавляем мапинг запросов server.respondWith 3. делаем запрос $.get 4. отдаем запрос фейковым сервером server.respond( ) Wednesday, January 30, 13
  • 28. Тестирование DOM. 1. тестировать все не нужно. Достаточно проверить наличие элемента и его атрибуты 2. Создаем html fixture: переменная или test page 3. перед каждым тестом вставляем его в DOM 4. после каждого теста очищаем DOM Wednesday, January 30, 13