Щомісячні архіви: Січень 2014

Бідна людина в кешування в JavaScript

[TL;DR версії: використовує кукі для зберігання результатів async дзвінків; візуалізації результатів останніх async дзвінків негайно а потім підтвердити їх після завантаження сторінки.]

Я працюю на intranet-сайті SharePoint для клієнта цієї функції, серед іншого, стилізований другорядного меню, чиї параметри меню керування через регулярні старі настроюваним списком.  Ідея полягає в тому, що клієнт одержує управління меню "своїх" сайт без зачіпають або під впливом глобальної навігації, згасити його.

(Існує щось неймовірно підривних про додавання CEWP, що вказує на файл HTML, який завантажує деякі CSS і JS докорінно змінити характер майже все про поведінку сайту..., але це на іншій посаді)

Код для цього дуже проста:

  • Чекати сторінку для завантаження і зробити async, зателефонуйте завантажувати до пунктів меню зі списку за допомогою відпочинку або lists.asmx або будь-який інший
  • Використання jQuery, динамічно заповнення букет, якщо <Лі>у всередині батьків <ul> (у Піндер християнський статті тут спрощене пояснення цього tecnnique)
  • Робити все форматування за допомогою CSS
  • Прибуток!

Хворе місце тут в тому, що кожного разу, коли хтось потрапляє одним із сторінки сайту, Цей користувач веб-браузер простягає руку отримати елементи зі списку.  Після того, як dev є повним і тестування довела речей, щоб бути стабільною і повний, цей заклик не є необхідним більше, ніж 99% часу, оскільки у меню рідко змінюється.  До нього дивні афекту користувальницький інтерфейс, який є спільним в цьому прекрасному новому світі гіпер ajaxy веб-сайтів-сторінка надає, і тільки потім меню візуалізації.  Це нервовий і відволікає, на мій погляд.  І нервовий. Так, кешування. 

Я змінив логіка константи виглядає:

  • Знайдіть файл cookie у веб-переглядачі, що містить меню, як я останній раз читав його
    • Якщо знайдено, зробити його негайно.  Чи не чекайте, сторінки завантаження.  (Ви повинні переконатися, що ваш HTML стратегічно розташованих тут, але це не важко зробити).
  • Чекати сторінку для завантаження і зробити async, зателефонуйте завантажувати до пунктів меню зі списку за допомогою відпочинку або lists.asmx або будь-який інший
  • Порівняти те, що я отримав від печива
    • Якщо він відповідає, Зупинити
    • В іншому випадку, використання jQuery, динамічно заповнення букет, якщо <Лі>в у в <ul>
  • Робити все форматування за допомогою CSS
  • Прибуток!

Деякі з ви збираєтеся сказати, "Ей! немає не реальних кешування тут відбувається так, як ви читаєте меню все одно кожен раз, коли.”  І ви маєте рацію-я не даю сервер будь-якого роду перерву.  Але тому що дзвінок async і відбувається після того, як сторінку від початкового Деструктивна HTML повністю надає, вона відчуває "себе" більш гнучкою для користувача.  Меню надає досить стільки, скільки сторінку малює.  Якщо меню відбувається до зміни, користувач піддається нервовий повторно перемальовувати меню, але що один раз.

Є кілька шляхів, щоб зробити цей кешування більш ефективним і допомогти на сервері в той же час:

  • Покласти в правило "куки кеш" дійсна протягом мінімум 24 годин або деякі інші терміни. Оскільки немає жоден файл cookie не прострочений, за допомогою файлу cookie, меню знімок і ніколи не потрапляють на сервері.

Добре..., що все, що спадає на думку прямо зараз :). 

Якщо хто має будь-які розумні ідеї тут я б із задоволенням їх знаємо.

І нарешті-ця техніка може бути використана для інших речей.  Цей клієнт сторінка має ряд динамічної речей на різних сторінках, багато хто з них відносно рідко змінюється (як раз на тиждень або раз на місяць).  Якщо ви націлюєте конкретних областях функціональності, можна надати більш гнучкою для користувача Інтерфейсу, потягнувши змісту з магазину місцевих печива й наданням негайно.  Вона відчуває себе швидше користувачеві навіть, якщо ви не записуєте сервер будь-якої циклів.  Ви можна зберегти сервер циклів, ухвалення рішення про деякі умовах і тригерів спростовувати кеш локальних файлів cookie.  Це все ситуаційні і претензійною речі і дійсно найвеселіше :). 

</кінець>

undefinedПідписатися на мій блог.

Йди за мною на Twitter в http://www.twitter.com/pagalvin

Як: Налаштувати Модульне тестування та тестування покриття з QUnit.js і Blanket.js для офісу 365 Застосунку SharePoint

Вступ

Я було вивчення Модульне тестування та тестування покриття для JavaScript, як я працюю над новим застосунку SharePoint для SharePoint онлайн, в офісі 365 Люкс.  Контури очевидні дослідження привели мене Qunit.js і після цього права, Щоб Blanket.js.

QUnit дозвольте мені встановити юніт-тестів і згрупувати їх на модулі.  Модуль — просто простий спосіб організування схожі тести. (Я не впевнений, я використовую його за призначенням, але вона працює для мене до цих пір з невеликий набір тестів, я до сих пір визначено).

Blanket.js інтегрується з Qunit і покаже мене фактичного ліній JavaScript, які були- і більш важливо – були не фактично виконані в ході працює тести.  Це «покриття»-ліній, які виконані покриваються тест, а інші ні.

Від створення хороші тести до перегляду покриття, Ми можемо зменшити ризик, що наш код має приховані дефекти.  Гарні часи.

Qunit

Припускаючи, що у вас Visual Studio проекту встановити, Почніть з завантаження JavaScript пакета від http://qunitjs.com.  Додати JavaScript і CSS відповідного на ваше рішення.  Шахта виглядає наступним чином:

image

Фігура 1

Як ви можете бачити, Я використовую 1.13.0 у той час я написав це повідомлення в блозі. Не забудьте завантажити й додати CSS-файл.

Що з на шляху, наступним кроком буде створити свого роду випробування упряжі і посилатися на біт Qunit.  Я тестування купу функції в сценарій файл з ім'ям "QuizUtil.js", так що я створив HTML-сторінку під назвою "QuizUtil_test.html", як показано:

image Фігура 2

Ось код:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<Голова>
    <Назва>QuizUtil тест з Qunit</Назва>
    <посилання REL= "таблиця стилів" href="../CSS/qunit-1.13.0.CSS" />
    <сценарій тип= текст/javascript"" НДЦ="QuizUtil.js" дані палітурці></сценарій>
    <скрипт типу ="текст/javascript" src ="qunit-1.13.0.js"></сценарій>
    <скрипт типу ="текст/javascript" src ="blanket.min.js"></сценарій>

    <сценарій>
        модуль("getIDFromLookup");
        тест("QuizUtil getIDFromLookupField", функція () {
            VAR goodValue = "1;#Paul Galvin";

            Рівне(getIDFromLookupField(goodValue) + 1, 2), "Ідентифікатор [" + goodValue + "] + 1 повинно бути 2";
            Рівне(getIDFromLookupField(не визначено), не визначено, "Невизначений вхідного аргументу слід повернути undefined результат.");
            Рівне(getIDFromLookupField(""), не визначено, "Порожні вхідного аргументу слід повернути невизначене значення.");
            Рівне(getIDFromLookupField("gobbledigood3-thq;dkvn Ада;skfja sdjfbvubvqrubqer0873407t534piutheqw;в. н."), не визначено,"Завжди прем'єр результат кабріолет на ціле число");
            Рівне(getIDFromLookupField("2;#деякі інші особи"), "2", "Перевірка [2;#деякі інші особи].");
            Рівне(getIDFromLookupField("9834524;#довгого вартість"), "9834524", "Велике значення тест.");
            notEqual(getIDFromLookupField("5;#хто-небудь", 6), 6, "Тестування на notEqual (5 Це не дорівнює 6 для цього зразка: [5;#хто-небудь]");

        });

        модуль("htmlEscape");
        тест("QuizUtil htmlEscape()", функція () {
            Рівне(htmlEscape("<"), "&lt;", "Втечі на менш ніж оператор ('<')");
            Рівне(htmlEscape("<DIV клас =  "someclass">Частина тексту</DIV>"), "&lt;DIV клас =&quot;SomeClass&quot;&gt;Частина тексту&lt;/DIV&gt;", "Більш складні тестовий рядок.");
        });

        модуль("getDateAsCaml");
        тест("QuizUtil getDateAsCaml()", функція () {
            Рівне(getDateAsCaml(нові Дата("12/31/2013")), "2013-12-31T:00:00:00", "Тестування жорстких закодованих дата: [12/31/2013]");
            Рівне(getDateAsCaml(нові Дата("01/05/2014")), "2014-01-05T:00:00:00", "Тестування жорстких закодованих дата: [01/05/2014]");
            Рівне(getDateAsCaml(нові Дата("01/31/2014")), "2014-01-31T:00:00:00", "Тестування жорстких закодованих дата: [01/31/2014]");
            Рівне(getTodayAsCaml(), getDateAsCaml(нові Дата()), "getTodayAsCaml() має дорівнювати getDateAsCaml(Нова дата())");
            Рівне(getDateAsCaml("дурниці значення"), не визначено, "Спробувати отримати дату дурниця значення.");
            Рівне(getDateAsCaml(не визначено), не визначено, "Спробуйте отримати дату на [не визначено] Дата.");
        });

        модуль("getParameterByName");
        тест("QuizUtil getParameterByName (від рядку запиту)", функція () {
            Рівне(getParameterByName(не визначено), не визначено, "Спробуйте отримати Невизначена параметр слід повернути невизначеною.");
            Рівне(getParameterByName("не існує"), не визначено, "Спробувати отримати значення параметра, коли ми знаємо, що не існує параметра.");

        });

        модуль(«Печиво");
        тест("QuizUtil різні функції cookie.", функція () {
            Рівне(setCookie("тест", "1", -1), getCookieValue("тест"), «Get я встановив cookie повинен працювати.");
            Рівне(setCookie("anycookie", "1", -1), Істина, "Налаштування дійсні приготування слід повернути значення" true".");
            Рівне(setCookie("crazy cookie ім'я !@#$%"%\^&*(()?/><.,", "1", -1), Істина, "Установка поганий cookie ім'я слід повернути"false".");
            Рівне(setCookie(не визначено, "1", -1), не визначено, "Проходження невизначене, як ім'я файлу cookie.");
            Рівне(getCookieValue("не існує"), "", "Cookie не існує тесту.");
        });

    </сценарій>
</Голова>
<тіло>
    <DIV ID= "qunit"></DIV>
    <DIV ID= "qunit арматур"></DIV>

</тіло>
</HTML>

Є кілька речей, що відбувається тут:

  1. Посилання на мій код (QuizUtil.js)
  2. Посилання на Qunity.js
  3. Визначення деяких модулів (getIDFromLookup, Печиво, та інші)
  4. Розміщення на <DIV> ID рівним "qunit".

Потім, Я просто підтягти цю сторінку, і ви отримаєте щось на зразок цього:

image

Фігура 3

Якщо ви подивіться через верхню, є кілька способів, дві з яких є цікавим:

  • Приховати пройшли випробування: Досить очевидно.  Може допомогти очі просто побачити проблемні області і не багато перешкод.
  • Модуль: (падіння вниз): Це буде фільтрувати тести аж до тільки ті груп випробувань, що ви хочете.

Що стосується тести, самі – кілька коментарів:

  • Само собою зрозуміло, що вам потрібно написати код, така, що це в першу чергу перевіряються.  За допомогою засобу можуть допомогти забезпечити дотримання цієї дисципліни. Наприклад, Я мав функції, яка називається "getTodayAsCaml()”.  Це не дуже перевіряються, оскільки необхідне немає вхідного аргументу і протестувати його за рівність, Ми повинні постійно оновлювати тестовим кодом з урахуванням поточної дати.  Я реструктурувати, шляхом додавання даних вхідний параметр потім проходить поточну дату, коли я хочу поточну дату у форматі CAML.
  • Qunit рамках документи свого випробування, і здається досить надійною.  Це можна зробити прості речі, як тестування за рівність і також має підтримку стилю ajax дзвінки ("реального" або mocked, використовуючи ваш улюблений насмішник).
  • Також проходять через процес змушує вас думати, через край випадках – що відбувається з "невизначені" або null передається в функції.  Це робить його мертва проста, щоб перевірити ці сценарії на.  Хороший матеріал.

Покриття з Blanket.js

Blanket.js доповнює Qunit шляхом відстеження фактичних рядків коду, що виконати в ході проведення тестів.  Вона інтегрує право в Qunit таким чином, навіть якщо це абсолютно окремий додаток, він грає красиво-дійсно схоже це один додаток безшовні.

Це blanket.js в дії:

image Фігура 4

image

Фігура 5

(Ви насправді мають натискати на прапорець "Увімкнути охоплення" у верхній [див. малюнок 3] Щоб увімкнути цю функцію.)

Виділені лінії на малюнку 5 не були виконані, будь-який з моїх тестах, тому необхідно розробити тест, що змушує їх виконання, якщо я хочу, щоб повне покриття.

Отримати blanket.js працює, виконавши такі дії.:

  1. Завантажити його з http://blanketjs.org/.
  2. Додати його до вашого проекту
  3. Оновити вашу пробну сторінку амуніція (QuizUtil_test.html в моєму випадку) наступним чином:
    1. Код посилання
    2. Прикрасити ваш <сценарій> посилання, як це:
    <сценарій тип= текст/javascript"" НДЦ="QuizUtil.js" дані палітурці></сценарій>

Blanket.js підбирає атрибут "даних палітурці" і робить свою магію.  Це гачки в Qunit, оновлює користувальницький інтерфейс, щоб додати параметр "Увімкнути охоплення" і вуаля!

Резюме (TL; Д-Р)

Використовувати Qunit, щоб написати ваш тести.

  • Завантажити його
  • Додати його до вашого проекту
  • Написати упряж тестової сторінки
  • Створення тестів
    • Деякі коду бути перевіряються рефакторінг
    • Будьте винахідливі!  Думаю, божевільні, неможливо сценарії та перевірити їх все одно.

Використовувати blanket.js, щоб забезпечити висвітлення

  • Переконайтеся, що працює Qunit
  • Завантажити blanket.js і додати його до вашого проекту
  • Додати його в вашу пробну сторінку амуніція:
    • Додати посилання на blanket.js
    • Додати атрибут "даних палітурці" до вашого <сценарій> Тег
  • Запустити Qunit випробувань.

Я ніколи не робив це раніше і деякі елементарні речі працюють в кілька годин. 

Щасливі тестування!

</кінець>

undefinedПідписатися на мій блог.

Йди за мною на Twitter в http://www.twitter.com/pagalvin