2014-02-10 5 views
16

Я совершенно новичок в D3JS и хотел бы понять стратегии тестирования D3 JS.Что такое стратегии тестирования модулей для D3JS?

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

Java Script код:

function LineManager() {} 
function LineProperties() { // Line Properties } 
LineManager.prototype.draw = function(properties) { 
    // D3 code to draw a line with the given properties. 
} 

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

it("should throw an exception if line graph properties are not set.", function() { 
     expect(lineManager.draw.bind(lineManager)).toThrow("Line Graph properties not set"); 
    }); 

it("It should have single line chart", function() { 
    lineManager.draw(properties); 
    expect(lineManager.countLines()).toEqual(1); 
}); 

Я написал юнит-тесты, чтобы убедиться, что файл TSV становится генерироваться правильно. Но имеет ли смысл писать единичный тест, чтобы убедиться, что данные правильно отображаются? Разве это не больше, чем модульный тест d3js, а не модульный тест для моей функции?

Так что мой вопрос: какие тесты следует рассматривать для диаграмм, генерируемых d3js?

+0

Я всегда тестировал любую часть, которая что-то делает с данными, которые затем будут нарисованы с помощью d3. Так, например, если вы создавали кумулятивный линейный график, я бы проверял, что [0,5,2,1] преобразуется в [0,5,7,8], который затем применяется к отбору и рассвету (и что необычные случаи обрабатываются изящно). Было бы интересно посмотреть, что другие делают. –

+0

Один из способов сделать это - использовать [Selenium] (http://docs.seleniumhq.org/). –

+0

Вам, вероятно, придется просмотреть мой ответ, я его отредактировал. Поскольку я не согласен с вашим ответом немного и объяснил причину. Надеюсь, это будет полезно. – Hafiz

ответ

6

Думаю, я получил ответ на свой вопрос. Попробуем объяснить это здесь.

Невозможно проверить правильность построения графика функцией JS, написанной с использованием D3JS. Для этого нам, возможно, придется использовать Phantom.js или аналогичную структуру, как упомянуто Крисофером. Я не беспокоился о том, что D3JS правильно рисует график, так как любые возможности D3JS и мой код могут с уверенностью предположить, что D3JS выполняет свою работу.

Мое беспокойство больше о том, правильно ли переданы данные D3JS и согласно моему требованию. Очень возможно удостовериться, что свойства графика установлены правильно, создавая объекты-шпионы. Я предоставляю тестовое тестовое тестовое приложение для кода JS, отображающего круг, используя D3JS.

CircleManager.js

function CircleManager() {}; 

CircleManager.prototype.draw = function(radius) { 
    var svg = d3.select("body") 
      .append("svg"); 

    svg.attr("width", 100) 
      .attr("height", 100);  

    var circle = svg.append("circle"); 
    circle.style("stroke", "black") 
     .style("fill", "white") 
     .attr("r", radius) 
     .attr("cx", 50) 
     .attr("cy", 50); 
}; 

CircleManagerSpec.js

describe("draw", function() { 
    it("Constructs an svg", function() { 
     var d3SpyObject = jasmine.createSpyObj(d3, ['append', 'attr']); 

     // Returns d3SpyObject when d3.select method is called 
     spyOn(d3, 'select').andReturn(d3SpyObject); 

     var svgSpyObject = jasmine.createSpyObj('svg', ['append', 'attr', 'style']); 

     // Returns svgSpyObject when d3.select.append is called. 
     d3SpyObject.append.andReturn(svgSpyObject); 


     d3SpyObject.attr.andCallFake(function(key, value) { 
      return this; 
     }); 

     svgSpyObject.append.andReturn(svgSpyObject); 

     svgSpyObject.attr.andCallFake(function(key, value) { 
      return this; 
     }); 

     svgSpyObject.style.andCallFake(function(key, value) { 
      return this; 
     }); 

     var circleManager = new CircleManager(); 
     circleManager.draw(50); 
     expect(d3.select).toHaveBeenCalledWith('body'); 
     expect(d3SpyObject.append).toHaveBeenCalledWith('svg'); 
     expect(svgSpyObject.attr).toHaveBeenCalledWith('r', 50); 
     expect(svgSpyObject.attr).toHaveBeenCalledWith('width', 100); 
     expect(svgSpyObject.attr).toHaveBeenCalledWith('height', 100); 
     expect(svgSpyObject.style).toHaveBeenCalledWith('stroke', 'black'); 
     expect(svgSpyObject.style).toHaveBeenCalledWith('fill', 'white'); 
    }); 
}); 

Надежда это помогает.

3

стратегия тестирования

Стратегия я в конечном итоге, используя для тестирования d3.js кода является создание вспомогательных функций для управления мои данные и настройки. Затем я тестирую эти функции. Поэтому для диаграмм я бы проверял каждую функциональность, связанную с данными, каждую функцию, чтобы установить ширину, легенды и т. Д.

Что касается функций рисования, это может стать более сложным, но с такими фреймворками тестирования, как buster.js, его можно будет легко реализовать они тоже. Хорошим способом тестирования диаграммы является подсчет количества баров/строк на странице, проверка печати легенд и т. Д.

Я бы не стал проверять, что диаграмма визуально одинакова, потому что визуально проверяя, что конечный результат тот же самый самый простой. Однако, при написании функции рисования, нужно быть очень внимательными к тому, что происходит на обновления (будет изменение данных сделать в два раза больше строк? Селекторы являются правые? ...)


тестирование Javascript

Отличная книга по тестированию javascript: Test Driven Javascript Development. Он содержит множество примеров и стратегий для проверки кода JavaScript. Большинство из них могут быть непосредственно применены к коду d3.js.


Инструменты

Недавно я искал решения для модульного тестирования кода d3.js и я в конечном итоге с помощью следующих инструментов:

buster.js

Buster.js является очень полная структура для модульного тестирования кода JavaScript в нескольких браузерах.

phantom.js

Phantom.js является обезглавленным WebKit скриптов с API JavaScript.

Это означает, что позволяет легко запускать автоматизированные тесты на JavaScript без необходимости использовать браузеры, такие как хром, сафари и т.д ..


EDIT: я теперь использовать жасмин для блока тестирование и селен (возможно, через сервис Saucelabs) для сквозного тестирования.

3

Я думаю, вы должны рассмотреть это: http://busypeoples.github.io/post/testing-d3-with-jasmine/

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

Мы, очевидно, не должны проверять, выполняет ли D3 свою работу правильно или нет. Поэтому мы можем использовать D3 внутри нашего тестового кода. Но D3 создает SVG, и мы можем проверять такие вещи, как если бы у svg были элементы, где ожидалось. Опять же, он не собирается проверять, демонстрирует ли SVG и правильно ли отображается или нет. Мы собираемся проверить, есть ли у SVG элементы, которые ожидаются, и они настроены так, как ожидалось.

Например: Если это гистограмма, мы можем проверить количество баров. Как в примере в приведенной выше ссылке, это проверяет это.

// extend beforeEach to load the correct data... 
beforeEach(function() { 
    var testData = [{ date: '2014-01', value: 100}, { date: '2014-02', value: 140}, {date: '2014-03', value: 215}]; 
    c = barChart(); 
    c.setData(testData); 
    c.render(); 
}); 

describe('create bars' ,function() { 
    it('should render the correct number of bars', function() { 
     expect(getBars().length).toBe(3); 
    }); 

    it('should render the bars with correct height', function() { 
     expect(d3.select(getBars()[0]).attr('height')).toBeCloseTo(420); 
    }); 

    it('should render the bars with correct x', function() { 
     expect(d3.select(getBars()[0]).attr('x')).toBeCloseTo(9); 
    }); 

    it('should render the bars with correct y', function() { 
     expect(d3.select(getBars()[0]).attr('y')).toBeCloseTo(0); 
    }); 
}); 

// added a simple helper method for finding the bars.. 
function getBars() { 
    return d3.selectAll('rect.bar')[0]; 
} 

Некоторые люди, вероятно, скажут, что мы будем использовать D3 внутри кода тестирования? Опять же, мы должны помнить, что цель тестового письма здесь заключается не в тестировании D3, а в нашей логике и SVG-коде, который компилируется в ответ на наш код.

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

Я думаю, что я ясно, если нет, то проверьте эту ссылку: http://busypeoples.github.io/post/testing-d3-with-jasmine/

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

+0

Обратите внимание, что [ссылки только ответов] (http://meta.stackoverflow.com/tags/link-only-answers/info) обескуражены, ответы SO должны быть конечной точкой поиска решения (vs. еще одна остановка ссылок, которые со временем становятся устаревшими). Пожалуйста, подумайте над добавлением отдельного синопсиса здесь, сохранив ссылку как ссылку – kleopatra

+0

@kleopatra, вы правы, но здесь он хочет, чтобы стратегия знала, как он должен действовать, и я думаю, что эта ссылка показывает, что он может проверить и сколько он может проверить. – Hafiz

+1

в конце дня это ваше решение, если вы хотите играть по правилам этого сайта или нет ;-) Просто остерегайтесь, что ваше сообщение - как есть сейчас - не является верным ответом и может быть удалено (не то, что я будет защищать его, но может случиться). Удачи! – kleopatra