Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   тестируете ли вы свой код? (https://javascript.ru/forum/misc/22270-testiruete-li-vy-svojj-kod.html)

x-yuri 13.10.2011 03:14

тестируете ли вы свой код?
 
если да (TDD, BDD..., не обязательно driven, в первую очередь автоматически), то как?

x-yuri 13.10.2011 13:57

да, надо было открытый опрос сделать...

Kolyaj 13.10.2011 14:05

Проблема в том, что неясно, как тестировать интерфейс.

Kolyaj 13.10.2011 14:06

Или самый простой пример. Есть функция getDocumentSize, которая вычисляет размер документа. Как для неё тест написать?

Gozar 13.10.2011 17:42

Цитата:

Сообщение от Kolyaj (Сообщение 131037)
Проблема в том, что неясно, как тестировать интерфейс.

В основном интерфейс тестирую, посредством создания множества однотипных объектов. Автоматически никак. Смотрю на процессор и поедаемый объем памяти.

А также поведение на слабой и средней по мощности машине + mobile. Тест проходит, только если работает на всех, за исключением особенностей мобильных версий. Каких-то одинаковых тестов нет. Если подскажете хороший инструмент, будет здорово.

Kolyaj 13.10.2011 17:47

Цитата:

Сообщение от Gozar
В основном интерфейс тестирую, посредством создания множества однотипных объектов. Автоматически никак. Смотрю на процессор и поедаемый объем памяти.

Ну это на быстродействие, как я понимаю. Как тестировать на правильное отображение и функционал?

x-yuri 14.10.2011 02:50

Цитата:

Сообщение от Kolyaj
Проблема в том, что неясно, как тестировать интерфейс.

ну вот, а я думал, что вы мне все расскажете :) На самом деле, слишком общий вопрос. Может быть с помощью какого-нибудь из этих инструментов (возможно не все из них предназначены для тестирования javascript-кода):

jasmine, selenium, Watir, sahi, mink, behat

jspec, Screw.Unit,

Dojo Objective Harness, JavaScriptMVC

Цитата:

Сообщение от Kolyaj
Или самый простой пример. Есть функция getDocumentSize, которая вычисляет размер документа. Как для неё тест написать?

https://github.com/Kolyaj/CrossJS/bl...cross.js#L2034
единственный вариант, подменять getViewportSize и getRootElement. Вообще я вижу два пути как начинать: 1) после каждой ошибки думать, как ее можно было бы избежать с помощью тестов и предпринимать действия, 2) писать тесты, когда это не сложно, при этом сложно со временем должно превращаться в несложно. Ну и в результате должны прийти либо к некоторому разумному покрытию тестами, либо к максимально возможному (что-то один из вариантов явно звучит утопично :) тоже разумному не хватает что ли...). В любом случае надо пробовать иначе ничего не понятно...

Цитата:

Сообщение от Gozar
Если подскажете хороший инструмент, будет здорово.

возможно что-то из ссылок выше

Цитата:

Сообщение от Kolyaj
Ну это на быстродействие, как я понимаю. Как тестировать на правильное отображение и функционал?

ну кросс-браузерность ты автоматически не протестируешь, если ты об этом...

я тут полазил по сети и решил поделиться тем, что нашел (опять же, не обязательно ориентировано на javascript):

Testing Backbone applications with Jasmine and Sinon
Tips for Unit Testing
Introducing BDD
Developer Testing and the Importance of Context
Mocks Aren't Stubs

Цитата:

The key point of testing, of course, is that you get good enough test coverage, cheaply enough. This is why unit tests are good: you can test the same things with functional tests, but you can generally do it more easily and cheaply with unit tests. That is why the real trick is not to work harder on writing the tests, but to write code that is more easily testable. When you take this approach, I think you'll find your logic naturally migrating out of pages and into classes.
http://c2.com/cgi/wiki?UnitTest

Цитата:

See ExtremeProgrammingTestingPrivateMethods, and MethodsShouldBePublic. You specifically do not want to test method implementations unless you are really desperate to put in some tests (perhaps when UnitTestingLegacyCode). If the implementation changes, the tests break; not fun. You don't want the tests to force you into a particular implementation. You want the tests to work as scaffolding, not a cage.
http://c2.com/cgi/wiki?UnitTest

Цитата:

I like tests because I am very lazy, somewhat pragmatic, and flagrantly ignorant of established practices. I have no idea whether what I'm doing is what XP calls a unit test (although I suspect I'm pretty close), but from my point of view it doesn't matter much. I do whatever testing makes my whole job easier, and ignore whatever testing makes my whole job harder. If 80% coverage (to pick a number out of the air) is pretty easy to do and has clear benefits, then that's the coverage I get. If 100% coverage is harder than I perceive the benefit to be, then I don't do it. In my mind, there's a curve of cost vs. benefit, and that curve has a sharp knee. I'm looking for that knee when I test.

To my mind, this is the key thing. Not what percentage you are getting for coverage, or do you have a test for every class, or do you test accessors or not, or is it what anybody else is calling a unit test or a functional test. The key thing is that you are paying attention to the benefit you get from your testing, and you push your testing up to the point that the hurt starts to outweigh the benefit and then back off a little. When you find a defect and there was a test you could have done that was easier than having that defect, perhaps next time you'll do that test. When you find that there's a class of defect you test for that turns up so rarely that you feel like you're wasting your time, back off on testing for that class of defect. Then pay attention to what happens. If you were wrong to stop testing for that kind of defect, you'll hurt more. If you were right, you'll hurt less. Hurt is a wonderful feedback mechanism.

Speak, then listen. Throw, then watch. Feedback. Feedback. Feedback.

There's a fair chance that I'm not following established XP practices at all (although it doesn't matter all that much to me). But I hope this does explain how I make testing worth my while. -- WayneConrad
http://c2.com/cgi/wiki?TestEverythin...dPossiblyBreak

Kolyaj 14.10.2011 09:11

Цитата:

Сообщение от x-yuri
ну кросс-браузерность ты автоматически не протестируешь, если ты об этом...

Я готов каждый браузер руками запускать и открывать там нужную страницу :)

Цитата:

Сообщение от x-yuri
единственный вариант, подменять getViewportSize и getRootElement.

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

x-yuri 15.10.2011 00:36

Цитата:

Сообщение от Kolyaj
На что подменять?

условно так:
function getViewportSize() { return [1, 1]; }
function getRootElement() { return {scrollWidth: 2, scrollHeight: 2}; }

Kolyaj 15.10.2011 09:19

Как мне это поможет проверить правильность определения размеров документа? Фишка-то в том, что чтобы проверить правильность размеров, нужно определить размеры. Рекурсия.
То же самое с позицией элемента.

x-yuri 16.10.2011 14:32

Цитата:

Сообщение от Kolyaj
Как мне это поможет проверить правильность определения размеров документа?

это не поможет тебе проверить правильность определения размеров. Это поможет тебе проверить, что сама функция работает правильно. White box testing. Можешь статью Фаулера почитать про моки и заглушки. И да, я не уверен, что надо так тестировать. Я выше писал, что кросс-браузерность автоматически не протестируешь. Хотя может быть что-то можно протестировать с помощью инструментов выше, я еще не разбирался детально. Но там писалось про интеграцию в браузеры.

tenshi 16.10.2011 19:09

x-yuri, функция получения размеров документа - 2 строчки кода. там нечего тестировать. эти 2 строчки в отрыве от всего остального тестировать вообще нет никакого смысла. именно поэтому 90% модульных тестов - мусор. лучше применять так называемые каскадные тесты. когда модули тестируются без отрыва от окружения, полагаясь на то, что модули ими используемые уже протестированы.

tenshi 16.10.2011 19:10

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

tenshi 16.10.2011 19:14

ну и на правах рекламы:

http://nin-jin.github.com/web-compon...doc.xml?LO858F

Kolyaj 17.10.2011 13:09

Цитата:

Сообщение от tenshi
Kolyaj, в данном случае нужно создать документ заданой наперёд высоты и проверить совпадают ли вычисленные этой функцией значения с эталонными.

Ну ок, давай чуть усложним задачу. Нужно протестировать функцию вычисления размеров viewport-а. Как ты создашь страницу с заранее заданными размерами окна, да ещё чтобы они были одинаковы во всех браузерах?

tenshi 18.10.2011 00:43

никак. некоторым функциям нужно просто доверять.

Kolyaj 18.10.2011 11:20

Ну вот именно этой доверять не хочется :)

tenshi 18.10.2011 20:22

почему? есть основания ей не доверять?

axyd 17.11.2011 00:39

Даже не представляю как работать с динамическими языками без тестов/спецификаций, использую Jasmine.

Например, тестирование логики (простенький IoC / DI)
https://github.com/alexeypetrushin/r...on_spec.coffee
сам код
https://github.com/alexeypetrushin/r...jection.coffee

Тестирование интерфейса (Backbone.js)
https://github.com/alexeypetrushin/r...es_spec.coffee
сам код
https://github.com/alexeypetrushin/r...ntities.coffee

Про то что все не протестировать и про кроссбраузерность:
Да, но есть хорошая новость - ошибки в програмных продуктах подчиняются закону Парето (power law) и распределены нелинейно. Хорошая - потому что можно писать всего-лишь простейшие тесты для 20% функционала и это позволит отловить более 80% всех ошибок.

Про кроссбраузерность - можно селениумом тестровать, но это уже сложно.

П.С. кстати, кто использует Jasmine (особенно6 если используете ее с CoffeeScript), может буде интересно, вот эта штука http://alexeypetrushin.github.com/mary позволяет поменять форму записи expectation и писать

'Mary'.should match: /ry/
или
'Mary'.should().match /ry/

вместо
expect('Mary').toMatch(/ry/)

axyd 17.11.2011 00:54

Вторым, не таким видимым но не менее значимым достоинством спецификаций (BDD/TDD) является то что без них невозможны все эти refactoring, SCRUM, agile, прочие методологии.
Потому что ключевой компонент всех этих методик - возможность развивать проект мелкими итеративными шагами, или, говоря другими словами - возможность быстрого и безболезненного внесения правок в код проекта.

А без тестов это невозможно, потому что хрен знает будет ли проект работать после этой, даже очень маленькой правки.
И эта неявная проблема - высокая стоимость внесения изменений (потому что после каждой правки нужно тратить время на ручное тестирование) может тормозить развитие проекта.

x-yuri 26.12.2011 20:36

есть идея попробовать написать несложное веб-приложение под руководством DjDiablo. Я предлагаю написать todo (веб-приложение в смысле, а не todo для веб-приложения). Есть ли есть идеи, можете предлагать.

DjDiablo 26.12.2011 21:53

Спасибо за предложение.

Todo веб приложение, и тодо как компонент для джумлы (к примеру), не имеют таких уж больших различий. Ну за исключением того что компонент по любому пишется на Joomla Framework, а с фреймворком для самостоятельного приложения мы вправе определиться сами, ну и некоторые вещи из cms придется дописать, типа авторизации.

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

Если говорить шире, есть некая критическая точка в разработке, когда сложность приложения превышает сложность используемый функционал платформы на которой это приложение разработано. Грубо говоря вы используете 100 методов из фреймворка, и 1000 методов разработанных вами же. Вот когда это происходит тогда и начинается настоящие веселье. Потому что нужно собрать свои мысли в кучу, упорядочить действия, спланировать, предусмотреть, то есть нужно думать и плавать в своём же "говне" :) , справочник по jqiuery тут уже неспасёт :). Этот проект проблематику не раскроет конечно, но для затравки сойдёт пожалуй.


Часовой пояс GMT +3, время: 16:57.