Subscribe

Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 15Apr

    crashtestdummyКоротенько изложу идею. И как всегда, уверен, что она не нова, т.к. ничего особенного в ней нет.

    Итак. Тестирование. Для меня синоним закрепления функционала. И тесты я как правило пишу, когда у меня утряслась бизнес логика и архитектура проекта, и даже отчасти написана документация ( в тех местах, где было не лень). Когда у вас просто класс, который супирует 2 числа и выдает результат, то написать автоматические тесты – не проблема. У меня стала задача написание автоматических тестов для сетевого приложения.

    Общая задача его сводится к следующему. К нему по очереди цепляются клиенты, оставляют какие то данные. Сервер обрабатывает и выдает инфу следующим клиентам. Это общая задача для любого сетевого приложения + есть игровой элемент, когда есть событие, которое может возникнуть с некой вероятностью. Как организовать тест. Первое, что пришло в голову — это тестируемые программы, которые подключаются к этому серваку, прогоняют функционал, проверяют ответы, выдают результат. Но можно проще. Тестируемое приложение имеет базовый класс. В котором создаётся объект сокет сервера и объект коннекта к бд. Мы создаем наследника от него, в котором переопределяем функции коннекта и обработки данных с сокет сервера, а функции эти просто сохраняют эти данные в отдельной переменной. Таким образом мы уже тестирует сам функционал, а не систему взаимодействия (которую изначально рассматриваем как черный ящик), и все тестирование по сути сводится к суммированию двух чисел. Кроме того — вы можете сразу выделить вероятностный функционал, например который генерит рандомное значение, и его также переопределить, чтоб данные не генерировались, а брались из заданного пула значений.

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

    Вот и все. Ваше мнение?

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Posted by Oduvan @ 1:10 pm

    Tags: , ,

Facebook comments:

  • Наоборот, заменил "наследование" "подставлением" :)

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

    Например, с наследованием. Есть у тестируемого класса некий метод, который принимает на вход какие-то параметры. В процессе работы он выкидывает ряд случайных чисел и что-то делает, в зависимости от случайных чисел и параметров. Как его тестировать? Унаследовать-то можно, но сам метод придется переписать полностью, чтобы исключить элемент случайности, а что же тогда тестируем? Без вмешательства в код исходного класса и разбрасывания функциональности на несколько методов, которые потом можно переопределить, ничего не выйдет.
  • ИМХО, гораздо лучше изначально разрабатывать подобные приложения для тестирования.

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

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

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

    Главный недостаток -- попахивает оверинжинирингом. Mea Culpa, надо признать :)
  • Vadim
    Идея хороша, и действительно не нова - что-то похожее описывает,например, Роберт Мартин рассказывая о ТДД в своей книге "Быстрая разработка программ".
blog comments powered by Disqus