Библиотека для тестирования js кода - YATS


Небольшая библиотека для проведения UNIT-тестирования кода.

Глобальный объект - yats
Страница разработки: https://github.com/xnimorz/YATS
Пример работы http://xnim.ru/EXAMPLE.html

Поддерживает




Проведение тестов с фиксировнаием переменной (test):



Работа с yats.

YATS может быть подключен c помощью commonJS, requireJS и как глобальный объект:
Подключение глобально: <script type="text/javascript" src="pathTo/yats.js"></script>
Библиотека создает глобальный объект yats.

Подключение с помощью requireJS: require("path/to/yats");
В этом случае глобальный объект не будет создан.



Методы библиотеки:



Проверка на соответствие выражению:

yats.ok({Логическое выражение\переменная\функция}) -

данная функция проводит проверку полученных данных на истинность.
В случае функции проводится также проверка на вызов исключения. Зеркальная функция:

yats.not({Логическое выражение\переменная\функция}) - проводит проверку принимаемого выражения на ложь



Примеры:

  1. yats
  2.    .group("ok/not" )
  3.    .comment("Проверка выполнения функции, которая возвращает true (ok)" ).ok(function(){return true; })
  4.    .comment("Тест функции, которая возвращает false (not)" ).not(function(){return false; })
  5.    .comment("Тест выражения (not)" ).not(1==2)
  6.    .comment("Тест undefined (not)" ).not(undefined)
  7.    .comment("Существование объектов (ok)" ).ok(a)
  8.    .comment("Тестирование boolean (not)" ).not(0)
  9.    .groupClose().toConsole();

This code was highlighted with code.xnim.ru




По первым двум тестам можно заметить, что данный метод позволяет "анализировать" результат выполнения функции. С другими типами данных метод проводит проверку на истинность.


Проверка равенства значений\ссылок:

yats.equal(значения через запятую) -

проводит проверку на равенство ВСЕХ аргументов, переданных в метод. Для элементарных типов проводится сравнение по значению. Для ссылочных - равенство ссылок

Примеры:

  1. yats.group("equal" ,"Тестирование соответствия Equal" )
  2.                 .comment("2 Числа" ).equal(1,1)
  3.                 .comment("Несколько чисел" ).equal(1,1,1,1,"1" )
  4.                 .comment("Тест фейла" ).equal(1,"1" ,"012" )
  5.                 .comment("еще один тест fail" ).equal(1,"1" ,"01" )
  6.                 .comment("Тестирование объектов" ).equal(a,b)
  7.            .groupClose()

This code was highlighted with code.xnim.ru






Проверка существования:

yats.exist(переменные)

Проводит проверку полученных данных на истинность


Проверка несуществования:

yats.notExist(переменные)

Проверяет все аргументы на false.

Примеры:

  1. yats.group("equal" ,"Тестирование соответствия Equal" )
  2.                 .comment("2 Числа" ).equal(1,1)
  3.                 .comment("Несколько чисел" ).equal(1,1,1,1,"1" )
  4.                 .comment("Тест фейла" ).equal(1,"1" ,"012" )
  5.                 .comment("еще один тест fail" ).equal(1,"1" ,"01" )
  6.                 .comment("Тестирование объектов" ).equal(a,b)
  7.            .groupClose()

This code was highlighted with code.xnim.ru




В данных тестах полученные данные проходят проверку только на не ложность. Соответственно результаты работы функций не обрабатываются (в отличие от ok/not)


Добавление комментария к следующему тесту:

yats.comment({string} текст) - Задает текст с следующему тесту

Пример:

  1. yats.comment("Это комментарий к тесту" ).ok(1==1);

This code was highlighted with code.xnim.ru


При выводе с помощью метода toConsole (описан ниже) - получим:




Форматный вывод в консоль:

yats.toConsole() - выделяет успешные тесты синим, неуспешные красным, ошибки - темно-крансым, выводит статистику тестов (проведено, пройдено, ошибок и т.д.)
Также строит иерархию из заданных груп тестов и (если к тесту были заданы комментарии) выводит связку - комментарий теста + результат теста.

Пример:

  1. var a = false;
  2. yats.comment("Проверка ложности a" ).notExist(a).comment("Проверка истинности 1 и 1 " ).equal(1,1).toConsole();

This code was highlighted with code.xnim.ru





Группировка тестов:

yats.group({string} название группы,{string} описание группы, {function} функция)
создает группу тестов с заданным названием и описанием. (используется для построения иерархии (чтобы не вводить все тесты в один "слой"))
тесты, содержащиеся внутри группы определяются одним из двух способов:

1) определена функция внутри yats.group (третий аргумент) - в данном случае в группу тестов будут включены все тесты, которые определены в заданной функции.
2) функция в yats.group не определена. В этом случае все последующие тесты будут добавляться в заданную группу до исполнения функции:

yats.groupClose() - данная функция закрывает группу.

Пример:
  1. var a ={s:2,f:3};
  2.       var b = a;
  3.       yats
  4.            .group("equal" ,"Тестирование соответствия Equal" ) //Открыта группа с именем equal
  5.              .comment("2 Числа" ).equal(1,1) //Success
  6.              .comment("Несколько чисел" ).equal(1,1,1,1,"1" ) //Success
  7.              .comment("Тест фейла" ).equal(1,"1" ,"012" ) //Fail
  8.              .comment("еще один тест" ).equal(1,"1" ,"01" ) //Fail
  9.              .comment("Тестирование объектов" ).equal(a,b) //Success
  10.            .groupClose()   //Закрыта группа с именем equal
  11.            .group("group_2" ,"Группа, в которой содержщиеся тесты определены в функции, которая следует третьем аргументом" ,
  12.              function()
  13.              {
  14.                 yats
  15.                    .comment("Существование объектов" ).ok(a) //Success
  16.                    .comment("Тестирования fail ok" ).ok(0) //Fail
  17.                    .comment("Тестирование несуществования" ).notExist(null,undefined) //Success
  18.                    .comment("Тестирование несуществования с 1 " ).notExist(null,undefined,1); //Fail
  19.              })
  20.              .toConsole();

This code was highlighted with code.xnim.ru





Цепочные вызовы - во всех примерах применяются цепочные вызовы. Существует только 1 функция, которая не позволяет продолжать цепочные вызовы:

yats.result() - получает результат прохождения последнего теста:
  1. yats.ok(1 == 1 ).result() //Success

This code was highlighted with code.xnim.ru




Тестирование с "фиксированием" переменной



Для "фиксирования переменной используется метод test(переменная)
В этом случае создается дополнительный объект, который содержит методы для работы с выбранной переменной.
Например, следующий код:
  1. var str="Hi! I''m yats!" ;
  2. yats.test(str).isDefined();

This code was highlighted with code.xnim.ru

Создает объект, который позволит проводить тестирование над переменной str и проведет тест истинности переменной.

Методы данного объекта начинаются с символов is:

isMatch({RegExp,String}) - проверяет переменную на соответствие строки или регулярному выражению,
isNotMatch({RegExp,String}) - проверяет переменную на НЕсоответствие строки или регулярному выражению

Пример:
  1.      var str = "hi! My name is Nikita" ;
  2.      var numb = 100 ;
  3.            yats.group("Тестирование переменных" )
  4.              .group("isMatch tests" ,"Тестирование строковой переменной" )
  5.                 .test(str)
  6.                    .comment("RegExp" ).isMatch(/[a-z]/g)
  7.                    .comment("другой строкой" ).isMatch("name" )
  8.                    .comment("числом" ).isMatch(100)
  9.                    .end() //Данная функция позволяет вернуться к yats из методов для тестирования "зафиксированной" переменной
  10.            .groupClose()
  11.            .group("isMatch tests" ,"Тестирование числовой переменной" )
  12.              .test(numb)
  13.                 .comment("RegExp" ).isMatch(/[a-z]/g)
  14.                 .comment("другой строкой" ).isMatch("name" )
  15.                 .comment("числом" ).isMatch(100)
  16.                 .end()
  17.            .groupClose()
  18.            .group("isNotMatch tests" )
  19.              .test(str)
  20.                 .comment("RegExp" ).isNotMatch(/[a-z]/g)
  21.                 .comment("другой строкой" ).isNotMatch("name" )
  22.                 .comment("числом" ).isNotMatch(100)
  23.                 .end()
  24.            .groupClose().toConsole();

This code was highlighted with code.xnim.ru




В данном примере 3 теста завершаются с ошибкой по причине - переменная с числовым значением не может проводить match тесты. (только переменные, в которых записаны строковые значения)



isDefined() - Проверяет выбранную переменную на истинность,
isUndefined() - Проверяет выбранную переменную на ложность

Пример:

  1.      var str = "hi! My name is Nikita" ;
  2.      var numb = 100 ;
  3.      var a ={s:2,f:3, str:str};
  4.      var b = a;
  5.      var c;
  6.      yats
  7.            .group("isDefined tests" )
  8.              .test(str).comment("Определена ли строка" ).isDefined().end()
  9.              .test(a).comment("Определен ли объект" ).isDefined().end()
  10.              .test(numb).comment("Определено ли число" ).isDefined().end()
  11.              .test(c).comment("Определена ли объявленная переменная без присваивания" ).isDefined().end()
  12.            .groupClose()
  13.            .group("isUndefined tests" )
  14.              .test(str).comment("Стрoка" ).isUndefined().end()
  15.              .test(a).comment("объект" ).isUndefined().end()
  16.              .test(numb).comment("число" ).isUndefined().end()
  17.              .test(c).comment("переменная без присваивания" ).isUndefined().end()
  18.            .groupClose().toConsole()

This code was highlighted with code.xnim.ru




В данном тесте, соответственно 4 ошибки и 4 успешных завершения. (так как 4 переменные подверглись как isDefined, так и isUndefined тестам


is({object}) -Сравнивает две переменные. Если переменная элементарного типа - проверяет по значению, если ссылочного - проверяет равенство ссылок

Пример:
  1.      var str = "hi! My name is Nikita" ;
  2.      var numb = 100 ;
  3.      var a ={s:2,f:3, str:str};
  4.      var b = a;
  5.      var c;
  6.      yats
  7.            .group("is tests" )
  8.              .test(str).comment("Стрoка" ).is("hi! My name is Nikita" ).end()
  9.              .test(a).comment("объект (разные ссылки)" ).is({s:2,f:3, str:str}).end()
  10.              .test(a).comment("объект (одна ссылка)" ).is(b).end()
  11.              .test(numb).comment("число" ).is("100" ).end()
  12.              .test(c).comment("переменная без присваивания" ).is(null).end()
  13.            .groupClose().toConsole();

This code was highlighted with code.xnim.ru




isEqual({object}) - Сравнивает две переменные. Если переменная элементарного типа - проверяет по значению, если ссылочного - Производит проверку равенства объектов по свойствам. (причем свойства сверяются по ссылкам ( по значениям только элементарные)

Пример:
  1.      var str = "hi! My name is Nikita" ;
  2.      var numb = 100 ;
  3.      var a ={s:2,f:3, str:str};
  4.      var b = a;
  5.      var c;
  6.      yats
  7.            .group("isEqual tests" )
  8.              .test(str).comment("Стрoка" ).isEqual("hi! My name is Nikita" ).end()
  9.              .test(a).comment("объект (разные ссылки)" ).isEqual({s:2,f:3, str:str}).end()
  10.              .test(a).comment("объект (одна ссылка)" ).isEqual(b).end()
  11.              .test(a).comment("объект и число" ).isEqual(2).end()
  12.              .test(numb).comment("число" ).isEqual("100" ).end()
  13.              .test(c).comment("переменная без присваивания" ).isEqual(null).end()
  14.            .groupClose().toConsole()

This code was highlighted with code.xnim.ru


Как можно заметить, объекты с одинаковыми свойствами в данном тесте эквивалентны


isContain({object}) - проверяет содержит ли объект заданное свойство. Причем, если вместо объекта задана строка - проверяет, существует ли заданная подстрока. А если задан массив - существует ли заданный элемент.

Пример:
  1.      var str = "hi! My name is Nikita" ;
  2.      var numb = 100 ;
  3.      var a ={s:2,f:3, str:str};
  4.      var b = a;
  5.      var c;
  6.      yats
  7.            .group("isContain tests" )
  8.              .test(str).comment("Стрoка" ).isContain("hi! My name is Nikita" ).end()
  9.              .test(a).comment("Содержит ли объект свойство с числом" ).isContain(2).end()
  10.              .test(a).comment("Содержит ли объект свойство со строкой" ).isContain(str).end()
  11.              .test(numb).comment("число" ).isContain("100" ).end()
  12.              .test(c).comment("переменная без присваивания" ).isContain(null).end()
  13.            .groupClose().groupClose().toConsole();

This code was highlighted with code.xnim.ru




end() - Возвращается к глобальному объекту yats (для цепочных вызовов) Примеры использования - тесты выше


Примеры работы


Пример EXAMPLE.html - можно попробовать здесь (необходимо будет перейти в консоль)

Планируется:



Расширенная информация о тесте
2013-08-27