|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
monstrU, я так и понял ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2016, 13:51 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
был несколько дней в отпуске - тема вниз ушла :). автор темы для примера использования неуправляемых ресурсов предложил задачу - запись в файл. и возникло мнение, что надо "просто в файл записать " да и все. предложу задачу сложнее. поступило от заказчика такое задание: необходимо клиентам рассылать текстовые сообщения по модему. клиенты находятся в Москве и Петербурге. Клиентам из Москвы надо рассылать сообщение по модемам фирмы Zyxel, клиентам из Петербурга- по модему Yota. какую архитектуру решения предложите? какие задачи каким логическим слоям выделять будете? что тестировать? и как? то есть по-простому просто "послать сообщение по модему " не прокатит, так как это отдельная аппаратно-программная задача. причем профессиональный архитектор-разработчик должен учитывать, что появятся другие города, другие фирмы производители модемов. как быть, если потребуется посылать не только текстовые сообщения, но и мультимедийные? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 13:48 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
monstrU, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Теперь Worker спокойно тестируется через передачу мока/стаба ISender. Ну и.... тестируем ZyxelSender, YotaSender по методу "просто в файл записать да и все. Рассчитываем что класс/драйвер работающий с модемами уже протестирован разработчиками". Других вариантов, для неуправляемых объектов, я не вижу, как и говорил ранее :) Мы ведь не тестируем в своих программах SqlConnection. Надеемся на разрабов мелкософта. Это их проблемы, т.к. они официально поддерживают этот компонент. PS. Можно также расписать внутренности YotaSender - замокав интерфейс работающий непосредственно с драйвером модема. И так далее, до самого низа. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 14:15 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotek, Абстракция интерфейса Sender здесь почти задана автором, в остальном же архитектурный bullshit. Почему интерфeйс а не абстрактный класс? наверняка некоторые методы будут общими. Worker.Send (ISender sender, string message) это вообще с ходу code smell - feature еnvy. И самое главное, вы решаете с энтузиазмом фиктивную задачу. см.ниже monstrU, В такой постановке надо настрочит две строчки, один раз самому протестироватъ на железе и забит болт на тесты. сначала две строчки: Код: c# 1. 2.
всё остальное что вы напридумывали про должен архитектор-разработчик полная ересть и подлежит анафеме. Теперь по пунктам. В такой постановке задачи практически нет функциональных требований а тот минимум что есть, покрывается двумя приведенными строчками кода. По хорошему надо уточнить, должна ли гарантироваться доставка, поведение в случае ошибки, временнее параметры, через сколько устройств будет проиусходитъ отправка, где берутся эти сообщения, как протоколируюется отправка, наличие паралельных процессов и в этом духе. когда эти требования будут названы именно они подлежат тестированию. а затребованные две строчки кода можно конечно тестировать, но это ментальный онанизм и пустая потеря времени. 1. спекуляции о дальнейшем развитии и как следствие "gas factory" - design anti-pattern. 2. тест вам не принесёт никаких приемуществ. Ваш софт не станет ни лучше ни надёжнее. А электричество можно с большим толком пользовать. Я исхожу из того, что вы будете обкатывать и тестировать минимум один раз на железе для обкатки "ATM команд". после этого теста автоматическое юнит-тестирование бесполезно. ничего не меняется. Если же изменятся требования, то вам придётся например реализовывать передачу картинки, то вы опять будете отлаживать на железе и старый тест вам ничем не поможет. всё написаное - ИМХО, без претензии на правду в последней инстанции. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 15:55 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
mikron, вы предлагаете сделать один класс, который будет Код: c# 1.
? Нарушение SRP - один класс на 2 вещи. Правильней сделать базовый класс отправляющий сообщение в порт, а наследники должны хранить эти строки (через protected свойство наверное). тогда можно без ifов вообще. Замена условного оператора полиморфизмом Не путайте интерфейс и базовый класс. Интерфейс передается тому кто будет его использовать - а базовый класс это способ реализации. Детали реализации. Интерфейс как раз нас отделяет от таких деталей. Тот кто использует интерфейс он даже не должен знать что там разные классы внутри у которых может быть один базовый класс. Интерфейс позволяет сделать 3 разных класса, 2 их которых будут произрастать от одного предка, а третий вообще левый, сторонней конторой написанный но поддерживающий интерфейс. PS. тестировать интерфейс через моки/стабы всяко легче чем базовый класс. У базового класса внутри логика, которая может неприятно сработать так что при вашем тесте будет отправляться реальное сообщение на почту. Замокав интерфейс будете уверены что проблем нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 16:12 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotek, вы не поняли мой поинт. Ваши архитектурные ментальные построения вообще не нужны. надо просто написать две строчки кода. При оооочень большом желании можно оформить их как функцию. задача решена. точка. Все ваши классы и интерфеисы - не требуются. Это только спекуляция. Если вы не согласны, огласите хоть одно требование, которое объясняет их сушествование. И я вам приведу пару аргументов, почему приведённый код - вреден. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 16:26 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
mikron, Топик создан по вопросу того как правильно тестить. Поэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать. Ваш код сложно тестировать. Если у вас там port.Send это реальный класс работающий с модемом, то вообще плохо. Завтра у вас появится третий модем и нужно будет менять эту строчку Код: c# 1.
Вы отдадите эту мелкую задачу студенту ("ну сделай по подобию, делов на 5 минут") и он внесет ошибку. Тест на такой код не написать, раз он работает с реальным оборудованием напрямую через port.Send. И вас повалятся ошибки в программе в самый неожиданный момент. Работу непосредсвенно с железом максимально минимизировать, чтобы вместо Код: c# 1.
стало Код: c# 1.
Ибо в вашем варианте студент тоже конечно сделает ошибку. С такой кучей реплейсов :) Ваш вариант конечно тоже рабочий, но это возможный спагетти-код в будущем. Когда 2 строчки только такие, это не страшно. Но если все приложение состоит из такого кода, то - фиг покроешь тестами - очень страаашно добавлять функционал. Уходите вообще от мысли "да тут простой код, хватит и двух строк". Забудьте об этом навсегда. Сегодня простой, а завтра нужно будет добавить новый функционал который гораздо сложнее и не решается простой заменой строки вида "ATM.sequence.for.zyxel". Может будет новый модем не поддерживающий стандартные протоколы а будет иметь свой, и руководство потребует "обеспечить его интеграцию в нашу прогу". Да даже если код простой, выделение в отдельный класс с интерфейсом позволит потом везде использовать этот интерфейс в виде мока при тестировании других классов. А ваше решение как использовать для тестирования других классов ? В общем будет у вас такой код для нового модема: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Переписывать же нету времени старый код - потом же все тестировать с нуля. Прикручиваем костыль. В лучше случае сделаете так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
получили дублирование кода. А если изначально все выделить в классы, то добавится новый класс с которым Worker будет работать через интерфейс как было. Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
При этом ZyxelSender и YotaSender смогут иметь общий базовый класс, а новый модем будет построен на отдельной иерархии классов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 16:58 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
mikron, тут тоже хорошо описано (хороший сайт с видео для каждого вида рефакторинга) Замена условного оператора полиморфизмом ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 17:18 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotek, тут вас поддерживаю. даже если в системе будут пользоваться только два модема и в обозримом будущем новые добавляться не будут, то на написание масштабируемой архитектуры уйдет немного времени. в живой системе требования все время расширяются, и если применять подход "тяп ляп и в продакшен" потому что сегодня не надо, то завтра получишь неподдерживаемую систему со спагетти кодом. так что если вы точно уверены, что систему сопровождать не будете - то "тяп ляп" наверно подойдет, но что то редко такое случается ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 17:29 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekmonstrU, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Теперь Worker спокойно тестируется через передачу мока/стаба ISender. Ну и.... тестируем ZyxelSender, YotaSender по методу "просто в файл записать да и все. Рассчитываем что класс/драйвер работающий с модемами уже протестирован разработчиками". Других вариантов, для неуправляемых объектов, я не вижу, как и говорил ранее :) Мы ведь не тестируем в своих программах SqlConnection. Надеемся на разрабов мелкософта. Это их проблемы, т.к. они официально поддерживают этот компонент. PS. Можно также расписать внутренности YotaSender - замокав интерфейс работающий непосредственно с драйвером модема. И так далее, до самого низа. Что есть Worker? Что есть Message? Конфигурация где? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 21:57 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
И где собственно связь Москвы с Zyxel, а Питера с Yota? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 21:59 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekТопик создан по вопросу того как правильно тестить. Поэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать. Ваш код сложно тестировать. Если у вас там port.Send это реальный класс работающий с модемом, то вообще плохо. Вы повторяете догмы и с упорством носорога игнорируете что я говорю. Две строчки кода (или "мой код" если угодно) вообще не надо тестировать. Под тестировать в конкретном контексте подразумевается покрытие юнит тестами и их автоматизация. ProBiotek Завтра у вас появится третий модем и .... Спекулятция Вы отдадите эту мелкую задачу студенту .... и он внесет ошибку. Тест на такой код не написать, трололо . И вас повалятся ошибки ... Спекулятция Ибо в вашем варианте студент тоже конечно сделает ошибку... Спекулятция Ваш вариант конечно тоже рабочий Пункт , но это возможный спагетти-код в будущем. Спекулятция Уходите вообще от мысли "да тут простой код, хватит и двух строк". Забудьте об этом навсегда. Сегодня простой, а завтра нужно будет добавить новый функционал который гораздо сложнее и не решается простой заменой строки вида "ATM.sequence.for.zyxel". пустые лозунги и догмы за отсутствием мыслей. Может будет новый модем не поддерживающий стандартные протоколы а будет иметь свой, и руководство потребует "обеспечить его интеграцию в нашу прогу". Да даже если код простой, выделение в отдельный класс с интерфейсом позволит потом везде использовать этот интерфейс в виде мока при тестировании других классов. Домыслы и фантазёрство. А ваше решение как использовать для тестирования других классов ? Никак. Оно решает поставленную задачу а не ваши фантазии. .... получили дублирование кода. А если изначально все выделить в классы, то добавится новый класс с которым Worker будет работать через интерфейс как было. Прогчее фантазёрство. Подводя итог мы видим: 1. вы признаёте, что две строчки решают поставленную задачу 2. вы не привели ни одного аргумента, почему поставленная задача требует более сложного архитектурного решения. 3. нафантазировали варианты развития событий и именно ими мотивируете архитектурный онанизм. Так как других аргументов кроме плодов вашей фантазии у вас нет давайте рассмотрим риски развития событий. ProBiotekЗавтра у вас появится третий модем и .... Во первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? У вас не стоит в задании "предусмотреть использование модемов 3-x производителей." А ваше самовольство стоит денег. И не только одноразовое но вличёт увеличение расходов на поддержку. Это я вам по доброму. А можно и за вредительство наказать. Во вторых, по опыту, вероятность наступления этого события я бы оценил не более 2%. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку. И кому нужен этот зоопарк? Другими словами даже если третий модем дешевле экономически выгодней возможно купить ещё один из уже поддерживаемых. ProBiotekЗавтра у вас появится третий модем и .... Вы отдадите эту мелкую задачу студенту .... и он внесет ошибку. Тест на такой код не написать, трололо . И вас повалятся ошибки ... Ибо в вашем варианте студент тоже конечно сделает ошибку... Если же наступит этот вариант, то затраты на удаление двух строчек кода минимальны. Затраты на архитектурное решение предложенное вами - те-же. Элементарная математика показывает что вы просто тратите ресурсы в пустую. Затраты архитектурного онанизма сразу >> архитектурное решение потом * 2% + затраты на удаление 2х строчек кода. Если же как обычно наступит другой вариант, что не 3й модем появится а новый метод доставки (СМС например). то трудозатраты на поддержание вашего онанизма будут значительно выше чем разработка нового архитектурного решения с нуля с учётом изменённых требований. Затраты архитектурного онанизма сразу + Затраты на поддержания устаревшего архитектурного решения >> затраты на удаление 2х строчек кода + архитектурное решение потом с нуля. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 01:43 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekПоэтому исхожу из того, что нужно писать так, чтобы было удобно тестировать.Ну если так хочется, то вынеси тестируемый код в отдельную сборку, не содержащую взаимодействий с "внешним миром", и не имеющую ссылок на сборки, содержащие взаимодействия с "внешним миром". После этого, как бы ты не написал тестируемый код, ты всегда сможешь его запустить в любом окружении: тест , консольное приложение, веб-служба, GUI-приложение и т. п. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 04:05 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
Архитектурный онанизм vs Простое и быстрое решение :) Технический долг и сраное легаси - это результат первого, или второго? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 09:09 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotek Во первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? У вас не стоит в задании "предусмотреть использование модемов 3-x производителей." А ваше самовольство стоит денег. И не только одноразовое но вличёт увеличение расходов на поддержку. Это я вам по доброму. А можно и за вредительство наказать. почему вы рассматриваете вариант, что бизнес знает о своих рисках? если рассмотреть другой вариант, что бизнес не предусмотрел появление нового типа модема по сотне причин? типа не подумали, или еще что. аналитики не очень компетентные. и вам после того, как воткнули две строчки для модема, поступает дополнение - есть клиент в Архангельске, а он по своим внутренним причинам может пользоваться только модемом Robotix. а вы начинаете руководству рассказывать, что они му**ки и почему сразу не сказали, и внедрить сейчас затруднительно, потому что мне заранее ничего не сказали? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 12:34 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
monstrUProBiotekВо первых вы занимаетесь не своим делом если спекулируете о рисках бизнеса. Откудого вам их знать? И кто дал вам право принимать решения о увеличении трудозатрат на разработку? почему вы рассматриваете вариант, что бизнес знает о своих рисках? если рассмотреть другой вариант, что бизнес не предусмотрел появление нового типа модема по сотне причин? типа не подумали, или еще что. аналитики не очень компетентные. Встречный вопрос: а почему нет? Я не говорю что бизнес знает и прогнозирует все риски. Но с наибольшей вероятностью он знает их лучше чем кто либо другой. А если каждая уборщится будете заниматься стратегическим планированием то горе такому предприятию и не долог час все окажутся у дороги. если рассмотреть другой вариант, в африке выпадет снег, и на москву упадёт метеорит, ля ля ля. Вообще ваши гипотетические построения страдают изяном: вы не учитываете вероятность и всегда исходите из самого маловероятного. monstrUи вам после того, как воткнули две строчки для модема, поступает дополнение - есть клиент в Архангельске, а он по своим внутренним причинам может пользоваться только модемом Robotix. а вы начинаете руководству рассказывать, что они му**ки и почему сразу не сказали, и внедрить сейчас затруднительно, потому что мне заранее ничего не сказали? Оставьте уже ваши буйные фантазии. Я же уже показал что стоимость вашего "предвидения" неоправдана и общие затраты всегда выше чем если сделать минимальное решение. Вы с математикой дружите? Посчитайте риски. Сумма ( вероятность исхода х стоимость исхода). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 14:12 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
mikron, честно говоря, если вместо ответов задавать новые встречные вопросы, то будут только вопросы и никаких ответов. да и некрасиво как то выглядит. я со страницы скопировал ваши цитаты 1. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку 2. Я не говорю что бизнес знает и прогнозирует все риски. так бизнес знает или не знает? вы вероятность события появления нового оценили цифрой с потолка в 2%. обратите внимание - в придуманной задаче. и почему то вашу оценку рассматриваете единственно верной - возьмите другую догму. давайте придумаем задачу с другой цифрой с потолка - в 92%. одна цифра ничем не хуже другой, но исходные данные в задаче те же - постановка без изменений, вероятность появления нового модема 92% и об этой вероятности вам никто не сказал. я тут согласен, что в случае такой простой постановки задач нужно сделать текущее решение минимальным - но минимальным насколько - использовать две строчки для команды модема или минимальную архитектуру разработать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 14:33 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
monstrUя со страницы скопировал ваши цитаты 1. Потому что бизнес знает, что внедрение типа нового модема потребует затрат на доработку софт, закупку и поддержку 2. Я не говорю что бизнес знает и прогнозирует все риски. так бизнес знает или не знает? Меня уже утомляют невнятные вопросы. бизнес знает что? Вы где-то увидели противоречие? Его здесь нет. это разные знания: знания рисков и знание стоимости внедрения. monstrUвы вероятность события появления нового оценили цифрой с потолка в 2%. обратите внимание - в придуманной задаче. и почему то вашу оценку рассматриваете единственно верной - возьмите другую догму. давайте придумаем задачу с другой цифрой с потолка - в 92%. одна цифра ничем не хуже другой, но исходные данные в задаче те же - постановка без изменений, вероятность появления нового модема 92% и об этой вероятности вам никто не сказал. Безусловно 2% это моя оценка. обсуждать просто дикие фантазии о 92% я не собираюсь. Одно замечу, если ваш в вашем предприятии разработчик так хорошо предвидит развитие бизнеса то ему место управляющего директора. Вообще дискуссия отдаёт студенчеством. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 15:13 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
skyANAАрхитектурный онанизм vs Простое и быстрое решение :) Технический долг и сраное легаси - это результат первого, или второго? :)Не забываем про избыточное проектирование. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 19:00 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ребята, вы приводите примеры неуправляемых ресурсов, но постоянно балансируете на грани юнит-тестов и моков . я бы не хотел, если бы ПО в самолете, на котором я лечу, было только так протестировано ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 20:14 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
fsharp_fsharp, Я уже сказал. Тестируем свой управляемый код, и расчитываем что драйвера работающие с неуправляемыми ресурсами протестены теми кто за них отвечает. Просто используем их в реальном приложении, а в тестах подменяем заглушками. Как тестировать ЭТИ неуправляемые ресурсы это отдельный разговор и это должно быть полностью изолированно от остального приложения. Я думаю есть способы тестировать такие вещи. Тестируют же в Микрософт как-то свои классы File, SqlConnection, тысячи других. Так что все должно быть в порядке, самолеты в безопасности ) мухи к мухам котлеты к котлетам. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 21:17 |
|
Как покрывать тестами класс использующий неуправляемые ресурсы (Бд, Файл, Порты и пр.)
|
|||
---|---|---|---|
#18+
ProBiotekfsharp_fsharp, Я уже сказал. Тестируем свой управляемый код, и расчитываем что драйвера работающие с неуправляемыми ресурсами протестены теми кто за них отвечает. Просто используем их в реальном приложении, а в тестах подменяем заглушками. Как тестировать ЭТИ неуправляемые ресурсы это отдельный разговор и это должно быть полностью изолированно от остального приложения. Я думаю есть способы тестировать такие вещи. Тестируют же в Микрософт как-то свои классы File, SqlConnection, тысячи других. Так что все должно быть в порядке, самолеты в безопасности ) мухи к мухам котлеты к котлетам. тогда ОК. тут уже все описано, как реализовывать тестируемый код. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 22:02 |
|
|
start [/forum/topic.php?fid=20&msg=39310027&tid=1400345]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 168ms |
0 / 0 |