Перейти к содержимому

Фотография

Как справляться с возрастающим количеством тестов?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 40

#21 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 12 октября 2009 - 10:20

Имеется ввиду, что можно весь этот конвеер настроить так, чтобы он выполнялся постоянно, 24 часа в сутки 7 дней в неделю. В результате, вы будете получать актуальные результаты регулярно и это дает возможность заранее среагировать на появление систематических ошибок. Оперативная реакция на результаты и методичное исправление практически всех, пусть даже мелких ошибок, связанных с реализацией тестов, через время (вопрос пары месяцев) приведет к тому, что % ложных ошибок сведется к показателям 2-3% от всего объема тестов. По-крайней мере у меня так произошло, когда я подправлял тесты, даже, если там приложение просто протормаживало. В результате, После прогона порядка 300 тестов (это только на моем направлении столько) общей длительностью 48 часов, мне надо было по сути просмотреть 4-5 тестов, которые упали по неизвестным мне причинам.

Вашими устами да мед пить:)
Я не вижу потребности гонять тесты круглыми сутками. Я не понимаю как это улучшит нашу ситуацию. Они и так гоняются регулярно, ежедневно.

Как минимум, это убирает необходимость каждый раз вручную всё запускать + если общее время выполнения меньше суток, то даже результаты полного запуска можно получать чаще, чем раз в день, соответственно, вы раньше увидите, что недавние изменения могли негативно сказаться на всём наборе тестов. Пример: у меня есть набор тестов, который выполняется часа 4-5. Соответственно, за сутки я получу 5-6 результатов их выполнения. Если тесты работают стабильно, все recovery сценарии отрабатывают, то результаты будут примерно одинаковыми + будут четко выявлены систематические ошибки, так как из опыта могу сказать, что для этого нужно где-то 3-4 четких воспроизведения, что я получаю втечение дня.

Да и нет у нас этих пару месяцев, поскольку каждый релиз создает новые вызовы.

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

Но мысль Ваша понятна, мы стараемся. Возможно не хватает профессионализма, возможно что-то не совсем хорошо с архитектурой как самих тестов, так и самого приложения.

Учитывая, что Ваши тесты гоняются круглосуточно, вопрос как Вы получаете логи для анализа и изменения. Как Вам удается делать сборку тестовых проектов автоматом. Мы используем SVN, и почти при каждом обновлении возникают проблемы мерджа, которые требуют ручного вмешательства.

Посмотрите, как работают такие инструменты, как Hudson, Bamboo. Они обычно привязываются к версионке и каждая сборка автоматически начинается с того, что в рабочий каталог сливаются последние версии файлов. В случае SVN это последняя ревизия. Обычно, где-то в корне проекта сидит какой-то скрипт, который производит сборку всего, что нужно. Это может быть и батник, и ANT-скрипт. Всё, что угодно и что удобнее использовать в той или иной задаче.

Логи - это просто файлы, содержащие информацию о результатах. По завершении прогона, как правило, идет нотификация, к которой прикрепляется лог или какая-то его часть. Если логи большие, что их можно копировать в некоторую рабочую папку (автоматически копировать, разумеется) и в нотификационном сообщении просто указывать ссылку на конкретные результаты.
  • 0

#22 DrVal

DrVal

    Постоянный участник

  • Members
  • PipPipPip
  • 230 сообщений
  • ФИО:Drozdov V. V.

Отправлено 12 октября 2009 - 16:23

Это не проблема, это объективная реальность.

Если количество тестов растет, то требуется больше ресурсов, чтобы анализировать результаты и поддерживать скрипты в рабочем состоянии.
Это то, о чем часто забывают, принимая решение об автоматизации.

Я бы сказал, что 6 тестировщиков на 26 разработчиков это мало.
Вы можете оптимизировать процесс, но рано или поздно упретесь в новый потолок, доля времени на анализ и поддержку будет все время расти вплоть до 100%.

Поясню мысль про разбиение тестов. Разбейте тесты на N кусков и сделайте N эталонных баз вместо 1-й. Сбой в одном куске не будет сказываться на следующем.

И введите такую метрику - количество заведенных багов (на приложение) за прогон или в единицу времени на количество зафейленных тестов.

Судя по описанию, он будет менее 10% для стабильных веток и менее 1% для нестабильной.
Постарайтесь довести до 50% :-)

Ну я понимаю что автоматизация применяется тогда, когда есть выгода. Эту выгоды мы понимаем и чувствуем. Проблема же во все возрастающем числе таких вот провероки как я ними справляться. Рекомендации я услышал, они не идеальны, но интересны. Будем работать


  • 0

#23 rlabs

rlabs

    Специалист

  • Members
  • PipPipPipPipPip
  • 660 сообщений
  • Город:Россия, Санкт-Петербург

Отправлено 12 октября 2009 - 19:36

Да я это понял, что в таком понимание автотестирование возможно только для ограниченных задач: манки тестирование, тестирование по модели - но все эти виды тестирования у нас не прокатят. Также фаззерование боюсь мало имеет смысла :(

Ну я понимаю что автоматизация применяется тогда, когда есть выгода. Эту выгоды мы понимаем и чувствуем. Проблема же во все возрастающем числе таких вот провероки как я ними справляться. Рекомендации я услышал, они не идеальны, но интересны. Будем работать

Похоже, я действительно плохо объясняю. Не надо путать "автотестирование" (примерно то, чем вы занимаетесь, пытаясь поставить на автомат все), и автоматизированное тестирование, когда автоматизации подвергаются наиболее трудоемкие и наименее требующие интеллекта задачи.

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

Пока не пересмотрите идеологию, будете наступать на все те же грабли.

Если количество тестов растет, то требуется больше ресурсов, чтобы анализировать результаты и поддерживать скрипты в рабочем состоянии.
Это то, о чем часто забывают, принимая решение об автоматизации.

Вот это очень интересно, можно подробнее? Получается, принятие решения об автоматизации == повышение убытков?
  • 0

#24 Oldman

Oldman

    Опытный участник

  • Members
  • PipPipPipPip
  • 331 сообщений
  • ФИО:Александр

Отправлено 13 октября 2009 - 05:22

....
Вот это очень интересно, можно подробнее? Получается, принятие решения об автоматизации == повышение убытков?

Почему убытков? Это повышение расходов (затрат)

P.S. Чет SALara не видно в теме аж странно :)
  • 0

#25 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 13 октября 2009 - 05:50

Всем гигантское спасибо. Как говаривала Масяня: Большое, блин, спасибо :)


Пока не пересмотрите идеологию, будете наступать на все те же грабли.

Несовсем понимаю, что значит пересмотреть иделогию. Насколько я понял из семинаров Баранцева, тестирование по модели, это одно из возможных путей или методов.

К сожалению я не имею возможность получить модель нашего приложения даже в очень примитивном приложении. Даже, если ее получить проку от нее будет ноль.

Естественно мы не проводим только автотестирование или автоматизированное тестирование. Естественно мы прикладываем голову тестировщиков, как же иначе. Возможно не очень эффективно.

Тем не менее название темы - Как справляться с возрастающим количеством тестов?

Как я понимаю, увеличение тестов - нормальное объективное явление, при неправильном учете этого явления возникают проблемы.

Алексей, Вы говорите - нужно менять идеологию, т.е. наша иделогия ошибочная, как я понимаю. Тогда какие конкретные рекомендации Вы могли бы дать, учитывая, что приложение сложное, многофункциональное CRM решение интегрированное с рядом ERP и SCM функций.?
  • 0
С уважением, Эдуард!

#26 Pryanik

Pryanik

    Постоянный участник

  • Members
  • PipPipPip
  • 214 сообщений
  • Город:МОСКВА

Отправлено 13 октября 2009 - 06:37

Всем гигантское спасибо. Как говаривала Масяня: Большое, блин, спасибо :)


Пока не пересмотрите идеологию, будете наступать на все те же грабли.

Несовсем понимаю, что значит пересмотреть иделогию. Насколько я понял из семинаров Баранцева, тестирование по модели, это одно из возможных путей или методов.

К сожалению я не имею возможность получить модель нашего приложения даже в очень примитивном приложении. Даже, если ее получить проку от нее будет ноль.

Естественно мы не проводим только автотестирование или автоматизированное тестирование. Естественно мы прикладываем голову тестировщиков, как же иначе. Возможно не очень эффективно.

Тем не менее название темы - Как справляться с возрастающим количеством тестов?

Как я понимаю, увеличение тестов - нормальное объективное явление, при неправильном учете этого явления возникают проблемы.

Алексей, Вы говорите - нужно менять идеологию, т.е. наша иделогия ошибочная, как я понимаю. Тогда какие конкретные рекомендации Вы могли бы дать, учитывая, что приложение сложное, многофункциональное CRM решение интегрированное с рядом ERP и SCM функций.?

Я вам вроде уже советовал, повторюсь переводите в автотесты только те проверки, которые дают постоянные результаты и уберите те, которые приходится изменять от билда к билду. Это снизит вам время на доработку и акуализацию. Например на данный момент, у меня порядка 150 тестов (не скажу что очень много) около 1500 проверок. Практически каждую версию что-то изменяется, но результаты остаются постоянные, приходится актуализировать их в связи с изменением архитектуры системы. Поддерживаю все тесты я один,в среднем уходит порядка 2 дней на регресс+актуализацию.
  • 0

#27 rlabs

rlabs

    Специалист

  • Members
  • PipPipPipPipPip
  • 660 сообщений
  • Город:Россия, Санкт-Петербург

Отправлено 13 октября 2009 - 08:11

К сожалению я не имею возможность получить модель нашего приложения даже в очень примитивном приложении. Даже, если ее получить проку от нее будет ноль.


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

Алексей, Вы говорите - нужно менять идеологию, т.е. наша иделогия ошибочная, как я понимаю. Тогда какие конкретные рекомендации Вы могли бы дать, учитывая, что приложение сложное, многофункциональное CRM решение интегрированное с рядом ERP и SCM функций.?

1. Уменьшать количество тестов, при этом увеличивая количество "тест-кейсов"
2. Упрощать тесты, переходить от комплексных последовательных сценариев к точечным проверкам критичной функциональности
3. Активно работать с разработчиками для повышения тестируемости приложения.
4. По мере продвижения п. 3 отходить от автоматизирования GUI.
5. Выписать на листочек причины падения тестов, не связанные с ошибками в приложении, и ликвидировать их по одной.
6. Сложное приложение разбить на более простые модули и повторять п. 1-5 для каждого из них.

Про идеологию я, по-моему, написал достаточно. У команды есть цель, группа тестирования помогает её достичь. "Автоматизация" - не цель, а одно из возможных средств, помогающих цель достичь.
  • 0

#28 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 13 октября 2009 - 10:04

Алексей, спасибо за комментарий. Правда мне сложно вас понимать. Возможно причина в различном понимании и употреблении терминов в разных контекстах

1. Уменьшать количество тестов, при этом увеличивая количество "тест-кейсов"

Что в данном случае понимается под "тест-кейсом", а что "тестом"?

2. Упрощать тесты, переходить от комплексных последовательных сценариев к точечным проверкам критичной функциональности

Что Вы понимаете под точеной проверкой функциональности?

3. Активно работать с разработчиками для повышения тестируемости приложения.

Пытаемся, но сами понимаете в данном случае повышение тестируемости- т.е. доступности идет в разрез с другими задачами и потребностями.

4. По мере продвижения п. 3 отходить от автоматизирования GUI.

Пока этого сделать не удается и я не вижу даже перспективы

5. Выписать на листочек причины падения тестов, не связанные с ошибками в приложении, и ликвидировать их по одной.

Ну для этого выписывать не имеет смысла, Сосбтвенно мы и ликвидируем их по одной

6. Сложное приложение разбить на более простые модули и повторять п. 1-5 для каждого из них.

К сожалению разбить на модули наше приложение не возможно
  • 0
С уважением, Эдуард!

#29 Clauster

Clauster

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 913 сообщений
  • ФИО:Худобородов Валерий
  • Город:Espoo

Отправлено 13 октября 2009 - 12:05

К сожалению разбить на модули наше приложение не возможно

У вас весь код в одном модуле? :acute:
Алексей, видимо, имеет ввиду следующее: берется некий модуль, допустим конвертор чего-то во что-то, из него собирается экзешник, к которому прикручивается тест (например на Питоне), в тесте имеем набор входных значений (тест-кейсов), где-то лежат ожидаемые. Тест прогоняется, результаты сравниваются с ожидаемыми, если что-то не совпадает - алярм.
  • 0

#30 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 13 октября 2009 - 15:01

К сожалению разбить на модули наше приложение не возможно

У вас весь код в одном модуле? :acute:
Алексей, видимо, имеет ввиду следующее: берется некий модуль, допустим конвертор чего-то во что-то, из него собирается экзешник, к которому прикручивается тест (например на Питоне), в тесте имеем набор входных значений (тест-кейсов), где-то лежат ожидаемые. Тест прогоняется, результаты сравниваются с ожидаемыми, если что-то не совпадает - алярм.


Зря смеетесь :) На самом деле у нас далеко не монолитное приложение, но выделит функциональные блоки на нынешнем этапе работ практически нельзя.

Но в остальном о чем Вы сказали мы так и делаем. Только тне компилируем отдельно, а проверяем прямо в приложении, а чем это хуже?
  • 0
С уважением, Эдуард!

#31 rlabs

rlabs

    Специалист

  • Members
  • PipPipPipPipPip
  • 660 сообщений
  • Город:Россия, Санкт-Петербург

Отправлено 13 октября 2009 - 16:36

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

Нет, это уже отдельное и малоизвестное колдунство.

Я же говорил о концептуальном разбиении. Ну, эээ, предположим, у нас есть гипотетическая система телефонии. Одна её часть работает собственно со звонками: отслеживает параметры связи, ведет запись для ФСБ, потом скидывает статистику в логи. Другая часть занимается биллингом, то есть на основе статистики выписывает счета пользователям.

Так вот, два компонента этой системы практически независимы, и тестировать их можно отдельно. Например, для проверки биллинга не нужно совершать 1000 звонков разной длительности, достаточно добавить в статистику запись о том, что они уже были совершены. А для совершения звонка не нужно проходить цепочку "посмотреть баланс-положить денег на счет-позвонить", достаточно просто вернуть статус "денег немеряно" из биллинга.

Такой подход (не являющийся открытием века, собственно) может сильно упростить тестирование.
  • 0

#32 Clauster

Clauster

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 913 сообщений
  • ФИО:Худобородов Валерий
  • Город:Espoo

Отправлено 13 октября 2009 - 16:40

Но в остальном о чем Вы сказали мы так и делаем. Только тне компилируем отдельно, а проверяем прямо в приложении, а чем это хуже?

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

#33 rlabs

rlabs

    Специалист

  • Members
  • PipPipPipPipPip
  • 660 сообщений
  • Город:Россия, Санкт-Петербург

Отправлено 13 октября 2009 - 16:47

Что в данном случае понимается под "тест-кейсом", а что "тестом"?

Что Вы понимаете под точеной проверкой функциональности?

Пытаемся, но сами понимаете в данном случае повышение тестируемости- т.е. доступности идет в разрез с другими задачами и потребностями.


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

Тест: печать документа. Тест-кейсы: новый документ, старый документ, документ класса "Накладная", документ без прав доступа, и тд и тп.

Точечная проверка: тест начинается на одном известном состоянии системы, заканчивается на другом очень близком состоянии. Пример плохого теста:
1. Установить приложение
2. Залогиниться
3. Открыть список документов
...
254. Убедиться, что документ напечатался.
...
999. Закрыть приложение.

Пример более хорошего теста:
1. Открыть приложение
2. Залогиниться существующим пользователем
3. Убедиться, что функциональность А доступна и логин произведен корректно

или:
1. Залогиненным пользователем создать документ типа А
2. Убедиться, что все данные документа сохранены корректно
  • 0

#34 Clauster

Clauster

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 913 сообщений
  • ФИО:Худобородов Валерий
  • Город:Espoo

Отправлено 13 октября 2009 - 16:51

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

Такой подход (не являющийся открытием века, собственно) может сильно упростить тестирование.

Типа всякие там драйверы и стабы что-ли?
  • 0

#35 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 15 октября 2009 - 09:07

Но в остальном о чем Вы сказали мы так и делаем. Только тне компилируем отдельно, а проверяем прямо в приложении, а чем это хуже?

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


Извините, не понял. Что это значит протестить перед сборкой. вы имеете в виду протестить тот модуль, компонент, который программер изменил, и только после выкладывать?
Если да - то я абсолютно за. Единственно, что а кто должен эти тесты писать, кто их должен прогонять? На мой взгляд неискушенный - разработчик

Поскольку у нас есть понятие бинарники сервера и клиента - то системщики проверяют перед компиляцией или в ее ходе свои проблемы.
У нас есть понятие ревизия пакетов, это как раз то что делают прикладники, выкладывая свои изменения. Вот эти свои изменения они не проверяют тщательно. Онистараются естественно проверить корректность исправления, но...

Мы же фактически тестируем то, что получилось после сборки бинарников и ревизии пакетов, т.е. то что положили в базу и как бинарники вытаскивают это и реализуют для работы
  • 0
С уважением, Эдуард!

#36 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 15 октября 2009 - 09:09

1. Залогиненным пользователем создать документ типа А
2. Убедиться, что все данные документа сохранены корректно

Странно что ответ на это сообщения не запостилось вчера

Алексей,мы так же делаем. Или изо всех сил стараемся. Я писл больше с примерами, но уже сил нет повторять
  • 0
С уважением, Эдуард!

#37 Clauster

Clauster

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 913 сообщений
  • ФИО:Худобородов Валерий
  • Город:Espoo

Отправлено 15 октября 2009 - 19:33

Но в остальном о чем Вы сказали мы так и делаем. Только тне компилируем отдельно, а проверяем прямо в приложении, а чем это хуже?

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


Извините, не понял. Что это значит протестить перед сборкой. вы имеете в виду протестить тот модуль, компонент, который программер изменил, и только после выкладывать?
Если да - то я абсолютно за. Единственно, что а кто должен эти тесты писать, кто их должен прогонять? На мой взгляд неискушенный - разработчик

Поскольку у нас есть понятие бинарники сервера и клиента - то системщики проверяют перед компиляцией или в ее ходе свои проблемы.
У нас есть понятие ревизия пакетов, это как раз то что делают прикладники, выкладывая свои изменения. Вот эти свои изменения они не проверяют тщательно. Онистараются естественно проверить корректность исправления, но...

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

Я имел ввиду автоматические тесты, которые прогоняются перед сборкой каждого билда. Пишут их разработчики, придают им смысл тестировщики.
Короче, если вы заинтересуете своих разработчиков в тестировании своих поделок, то бишь они будут думать о testability, внедрять TDD, BDD, и так далее, думаю, ваша проблема разрешится.
  • 0

#38 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 16 октября 2009 - 08:10

[...] Короче, если вы заинтересуете своих разработчиков в тестировании своих поделок, то бишь они будут думать о testability, внедрять TDD, BDD, и так далее, думаю, ваша проблема разрешится.

Похоже Вы правы. Интересно, а какие методы заинтересовать существуют? Тестеры будут доплачивать разработчику по 10 р за каждый написанный тест? :)
Или нужно долбить ПМа?
  • 0
С уважением, Эдуард!

#39 airguru

airguru

    Новый участник

  • Members
  • Pip
  • 47 сообщений

Отправлено 16 октября 2009 - 08:38

Спросил у нашего ведущего разработчика:
"-вот что тебя мотивирует писать юнит тесты? серьезно
-они у меня выполняют 2 функционала: 1-ый при помощи них удобно отлаживать работу некоторого алгоритма, являющегося частью другого алгоритма, на разных типах данных и ситуаций и т.д.
ну и второе- это проверка не привели ли мои супер гениальные реализации (ускорения или переработка и т.п.) к неработоспособности системы в целом, или ее подсистем."
Хотя в большинстве случаев наиболее значимую роль играет руководство. Если оно будет заинтересовано- оно мотивирует их... ))
  • 0

#40 Clauster

Clauster

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 913 сообщений
  • ФИО:Худобородов Валерий
  • Город:Espoo

Отправлено 16 октября 2009 - 09:23

[...] Короче, если вы заинтересуете своих разработчиков в тестировании своих поделок, то бишь они будут думать о testability, внедрять TDD, BDD, и так далее, думаю, ваша проблема разрешится.

Похоже Вы правы. Интересно, а какие методы заинтересовать существуют? Тестеры будут доплачивать разработчику по 10 р за каждый написанный тест? :)
Или нужно долбить ПМа?

Мне кажется основная мотивация - шаг на новый уровень и освоение современных технологий. Вообще это странно когда разработчик не заинтересован в качестве своего кода.
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных