Знакомство с Жасмин

Jasmine — это среда автоматизированного тестирования с открытым исходным кодом, основанная на разработке, основанной на поведении, которая помогает тестировать ваш код JavaScript. Она может работать и выполняться на любой платформе или там, где когда-либо запускается JavaScript. Jasmine не зависит от каких-либо браузеров, DOM или какой-либо другой среды JavaScript. Но объединение Jasmine с такими средами, как requireJS и JSCover, во время тестирования поможет сделать тесты более эффективными.

BDD

Разработка, управляемая поведением, — это метод разработки, в котором используется комбинация разработки, управляемой тестами, и проектирования, ориентированного на предметную область. Он объясняет сценарии в предложениях или пользовательских историях, а не в функциональных тестах. Таким образом, это помогает создать процесс разработки, который разработчики, бизнес или любые заинтересованные лица могли бы легко понять. Это увеличивает сотрудничество между разработчиками, тестировщиками и аналитиками за счет объединения функциональных, технических действий и совместного использования ресурсов проекта. Насколько Jasmine принадлежит к классификации BDD, является спорным вопросом.

Настройка Jasmine

Настройка Jasmine не сложная работа. Скачать последнюю автономную версию можно здесь. Для настройки автономной версии все, что вам нужно сделать, это написать тест и дать правильные ссылки на файлы библиотеки Jasmine, тесты и фактический скрипт внутри бегуна спецификации. Бегун спецификации - это файл HTML, в котором мы должны сослаться на библиотеку жасмина. файлы, ваши файлы JavaScript и тестовый файл jasmine в том порядке, в котором они упоминаются. При открытии бегуна спецификаций запустится остальное, и вы сразу увидите результаты.

Написание первого теста

Допустим, у меня есть файл helloworld.js, и мне нужно написать тесты для функции addNumbers, которая принимает 2 числа и возвращает их сумму. Чтобы начать писать тесты, мы должны сначала создать файл JavaScript и набор тестов. Я назову этот файл как helloworldTest.js. Откройте файл в своем любимом редакторе и начните создавать тесты. Сначала мы должны создать набор тестов перед тестовым набором. у нас может быть несколько наборов тестов в файле. Ниже приведен код для создания набора тестов. Тестовый пример должен находиться внутри набора тестов.

describe(“test suite name”,function(){
});

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

describe(“Addition specs”,function(){
  it(“should add 2 valid numbers and returns valid result”,   function(){
   expect(addNumbers(1,1)).toEqual(2);
   });
});

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

<title>Spec Runner</title>

  <!-- load jasmine -->
  <link rel="stylesheet" type="text/css" href="tools/Jasmine/jasmine.css">
  <script type="text/javascript" src="tools/Jasmine/jasmine.js"></script>
  <script type="text/javascript" src="tools/Jasmine/jasmine-html.js"></script>

  <!-- include source files here... -->
  <script type="text/javascript" src="src/HelloWorld.js"></script>

  <!-- include spec files here... -->
  <script type="text/javascript" src="specs/HelloWorldTest.js"></script>

Сопоставители

В последнем примере мы сравнили результат нашей функции addNumbers(1,1) с 2, используя toEqual(). Здесь этот toEqual() называется сопоставителем. У нас есть несколько сопоставителей, предоставленных самим жасмином, вот некоторые из них. Все сопоставители вернут логическое значение, и, таким образом, жасмин либо пропустит тест, либо сделает его неудачным.

· toMatch()
· toBeUndefined(
· toBeTruthy()
· toBeFalsy()
· toContain()
· toBeLessThan()
· toBeGreaterThan()
· toThrow()
· toBeCloseTo()
· toBe()

мы можем отрицать эти сопоставители, добавляя префикс .not. Например:-

 .not.toBeTruthy()

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

Пользовательские сопоставители

Используя эту функцию jasmine, мы создаем собственные сопоставители и используем их вместо встроенных. В приведенном ниже коде показано, как мы можем создавать собственные сопоставители для проверки любого числа больше 5.

this.addMatchers({
IsGreaterthanFive: function () {
return this.actual>5 }
});

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

до каждого и после каждого

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

var count=0;
beforeEach(function()
{
  count=count+1;
  console.log("Started executing test no : " + count);
});

Если beforeEach выполняется перед каждым тестом, как вы, возможно, уже догадались, afterEach выполняется сразу после завершения каждого теста. Таким образом, это можно использовать для очистки любых объектов, которые были изменены из-за предыдущего теста или около того, опять же в зависимости от того, что вы хотите сделать .

afterEach(function()
{
console.log(Completed executing test no : " + count);
});

Шпионить

Функциональность приложения может зависеть от некоторых других функций. Чтобы протестировать функциональность, нам может не потребоваться вызывать все зависимые методы, которые не входят в область тестирования. Некоторые из зависимостей, таких как константы, дешевы, но некоторые функции, такие как вызов ajax, могут занять много времени, чтобы ответить из-за многих причин, таких как задержка в сети. Если вызов ajax зависит от фактического метода, и вы хотите, чтобы их реализация отсутствовала из теста. Тогда вам не нужно звонить им, вместо этого вы можете сделать дубль этого звонка с помощью шпиона.

Шпионить

Если мы хотим создать шпион существующего объекта, мы можем использовать метод spyOn.

spyOn(Obj, "getSumofNumbers")

Объект .and в spyOn предоставляет несколько вариантов, позволяющих решить, как должен вести себя шпион.

callThrough():мы можем объединить callThrough() со шпиономobject будет отслеживать все вызовы и делегировать их фактической реализации. Таким образом, фактически будет вызван фактический вызов.

spyOn(Obj, "getSumofNumbers").and.callThrough();

returnValue() : Используя returnValue(), мы можем легко вернуть любое значение, которое мы хотим, в качестве вывода функции. Здесь в приведенном ниже примере все вызовы метода getRandomNumbers вернут 231 в качестве вывода.

spyOn(Obj, "getRandomNumber").and.returnValue(231);

CallFake(): callFake() просто делегирует вызов функции функции обратного вызова внутри функции callFake.

it(‘should add 2 valid numbers and returns fake method result’,function(){
 spyOn(window,’getSumofNumbers’).and.callFake(function(){return 5;});
 expect(getSumofNumbers(1,2)).toEqual(5);
//see here 1+2 is not returning actual value 3 instead it gives us //the faked result 5.
});

Stub() : метод-заглушка используется для создания подделки фактического метода. При использовании callThrough он фактически запускает реализацию фактического метода с использованием шпионского объекта, но заглушка не имеет этой реализации. Это полезно при проверке вызова функции действительно вызывается или нет, но не может проверить поведение метода .

it('should stub returns an undefined obect',function(){
  spyOn(window,'getSumofNumbers').and.callFake(function(){return  5;});
  window.getSumofNumbers.and.stub();
  expect(getSumofNumbers(1,2)).toBe(undefined);
  });
it('should check whether function call is invoked',function(){
  spyOn(window,'getSumofNumbers').and.callFake(function(){return 5;});
  window.getSumofNumbers.and.stub();
  var x = window.getSumofNumbers(1,2);
  expect(window.getSumofNumbers).toHaveBeenCalled(); 
  });

Создать шпион

CreateSpy в основном используется для создания шпиона за методом, который не входит в область контекста теста или нет никакого метода для шпионажа. У этих методов не будет реализации, поэтому с помощью createSpy мы можем заставить функцию предоставлять нам желаемый результат.

Если вы хотите, чтобы ваш шпионский метод возвращал значение, вы можете использовать andReturn(Value), чтобы сообщить Жасмин, что вы хотите получить взамен.

user.getDept = jasmine.createSpy(“getDept()”).andReturn(“IT”);

если вы хотите определить тело метода, мы можем использовать метод andCallFake() для записи функции внутри.

user.getDept = jasmine.createSpy(“getDept()”). andCallFake( function(){ 
var Dept= “I”+”T”;
Return Dept;
});

СоздатьSpyObj

CreateSpyObj используется для создания объекта со шпионами каждого имени, которое мы предоставляем в качестве свойства объекта.

car = jasmine.createSpyObj('car', ['accelerate','break','cluch',]);
So created spy's will have all the functionalities of spy function 
   
car.break.andReturn('break now');
car.accelerate.andCallFake(function() {return 'accelerated'});

Игнорирование наборов тестов

Как мы уже знаем, мы определяем набор тестов с помощью функции описания. Если по какой-либо конкретной причине мы не хотим запускать тест и отображать результат, мы можем пометить его как проигнорированный, добавив префикс describe. с помощью x.

xdescribe('ignored test suite',function(){/* some code here */});

Игнорирование спецификаций

Как и в случае с наборами тестов, мы можем игнорировать отдельный тестовый пример, добавляя к нему префикс с префиксом x.

xit('ignored test',function(){ /* some code here */});

Заключение

Модульные тесты — неотъемлемая часть решения. Jasmine помогает нам заполнить пробел, связанный с отсутствием эффективной среды тестирования на стороне клиента. может повлиять на качество теста.

Надеюсь, эта короткая статья помогла вам понять, как писать классные тестовые примеры для кода JavaScript.

Полезные ссылки

Исходный код Jasmine доступен на GitHub.

Получить Жасмин: http://jasmine.github.io/

Документация: http://jasmine.github.io/2.0/introduction.html