(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Использование IBM Rational Performance Tester для обмена данными между модульными тестами. Часть 1

Источник: IBM

Эта серия статей посвящена созданию модульных тестов производительности при помощи предоставляемой IBM Rational Performance Tester функциональности деления тестов с последующим динамическим обменом данными между тестами с использованием функциональности тестовых переменных. В серии объясняется, как выполнить следующие задачи: получить тестовые модули из существующих тестов, сохраняя при этом исходные тесты нетронутыми, разделить на части и аннотировать тест в режиме реального времени во время записи с помощью панели инструментов Rational Performance Tester Annotation, связать тестовые модули друг с другом, используя тестовые переменные, а также создать пользовательские сценарии с использованием различных тестовых модулей и моделирования рабочей нагрузки. В части 2 серии приведены пошаговые инструкции по использованию тестовой переменной для обмена данными между тестами.

Преимущества использования модульных тестов

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

Модульное тестирование дает следующие преимущества:

  • Сводит к минимуму необходимость перезаписи тестов каждый раз после каких-либо изменений.
  • Устраняет лишние шаги в тестах.
  • Уменьшает размер тестов.
  • Повышает надежность и возможность многократного использования тестов.
  • Облегчает отладку тестов и изменение направленности тестовых сценариев.

Подход на основе модульных тестов предусматривает создание небольших тестовых модулей, которые затем можно использовать в качестве строительных блоков для построения больших или меньших сценариев, в зависимости от целей теста. В данной статье рассказывается, как можно применить функциональные возможности IBM Rational Performance Tester, такие как разделение тестов и тестовые переменные , могут помочь в создании более надежных и более пригодных для повторного использования модульных тестов.

Терминология

Прежде чем углубиться в эти функциональные возможности, дадим определения следующим понятиям в контексте Rational Performance Tester:

Тестовый модуль - Небольшой тест, выделяемый из большего теста с намерением повторно использовать его в различных сценариях. С точки зрения Rational Performance Tester тестовый модуль ничем не отличается от обычного теста.
Разделение теста - Возможность создания нескольких тестовых модулей (сплит-тестов) из одного теста.
Тестовая переменная - Определяемая пользователем пара имя-значение, которая хранит информацию и предоставляет ссылку на нее на всем протяжении теста, а также между тестами.

Создание записей модульных тестов

Начиная с Rational Performance Tester версии 8.1 появилась возможность использовать функциональность разделения теста для деления большего теста на более мелкие тестовые модули при сохранении первоначального теста в неизменном состоянии. С помощью панели инструментов Annotation (начиная с версии 8.1.1) можно также определить границы тестовых модулей в процессе записи. Затем можно использовать тестовые переменные для связывания различных тестовых модулей друг с другом.

Тестовые переменные

  • Не включайте тестовые переменные в сплит-тесты.
  • Всегда выбирайте подключение к серверу посредством транзакции регистрации при тестировании регистрации для SAP.
  • Подключения к серверу автоматически включаются в HTTP-тест в качестве тестовых переменных и будут сохраняться с любым сплит-тестом.

В трех следующих разделах вы познакомитесь с выполнением следующих задач:

  • Деление SAP-теста после записи.
  • Деление HTTP-теста после и во время записи (в режиме реального времени).
  • Аннотирование HTTP-теста во время записи.

Хотя данная статья посвящена графическому интерфейсу пользователя SAP и HTTP-расширению, все остальные расширения Rational Performance Tester также поддерживают функциональность разделения теста и тестовой переменной.

Деление SAP-теста

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

Сплит-тесты

  • Приведены шаги для Rational Performance Tester версии 8.1.1, но они будут такими же и для версии 8.1 и более поздних, за исключением того, что вам будет предложено выбрать сплит-тест на последнем шаге.
  • SAP-тесты можно делить только на уровне транзакций. Это обязательное условие, поскольку запросы и ответы SAP вводятся поэкранно. Если нарушить порядок экранов, во время воспроизведения тест будет функционировать неправильно.
  • Не включайте контейнер тестовых переменных в выбранные варианты для сохранения в качестве нового сплит-теста.
  • Для SAP-теста всегда выбирайте подключение к серверу посредством транзакции регистрации при тестировании регистрации.
  • Подключения к серверу автоматически включаются в HTTP-тест в качестве субконтейнера контейнера тестовых переменных. Он будет сохраняться с любым сплит-тестом.

Процесс деления теста очень прост и не требует много времени:

  1. Откройте тест в редакторе тестов.
  2. Выберите транзакцию теста (см. рисунок 1).
  3. Щелкните правой кнопкой мыши и сохраните выбранный вариант как новый тест в открывшемся диалоговом окне сплит-теста, где можно переименовать тест и добавить к нему комментарии.

Рисунок 1. Выбор транзакций для сплит-теста
Рисунок 1. Выбор транзакций для сплит-теста

На рисунке 2 показан пример, в котором из одной записи SAP-теста получается три разных тестовых модуля. Эти тестовые модули включают тесты Login, Create order и Logout.

Рисунок 2. Получение нескольких тестовых модулей из одной SAP-записи
Рисунок 2. Получение нескольких тестовых модулей из одной SAP-записи 

Переменные сплит-теста

  • С каждым модулем сплит-теста сохраняется контейнер тестовых переменных. Он содержит тестовые переменные из первоначального теста. Вы можете добавлять и удалять переменные по мере необходимости.
  • Сплит-тесты HTTP содержат сгенерированные Rational Performance Tester тестовые переменные, которые создаются автоматически во время процесса деления. Они хранятся в контейнере Variables Created by Split Test (переменные, созданные сплит-тестом).
  • Rational Performance Tester автоматически определяет, какие переменные необходимо сохранить в сплит-тесте, и создает ссылки, так что вам не придется писать собственный код. Вы можете добавлять или удалять переменные по мере необходимости.

Деление HTTP-теста

Процесс деления сценария HTTP-теста аналогичен приведенному ранее для SAP, но с некоторыми отличиями:

  • HTTP-тесты можно делить во время записи, используя панель инструментов Rational Performance Tester Annotation для вставки точек деления.
  • HTTP-тесты можно делить на уровне страниц (см. рисунок 3). Также можно делить их и на уровне транзакций, если тест содержит транзакции.

Рисунок 3. Выбор страниц для сплит-теста HTTP
Рисунок 3. Выбор страниц для сплит-теста HTTP

На рисунке 4 показан пример нескольких модулей сплит-тестов, полученных из одной записи HTTP-теста. Модули включают тесты Login, Import, Create и Logout.

Рисунок 4. Получение нескольких тестовых модулей из одной HTTP-записи
Рисунок 4. Получение нескольких тестовых модулей из одной HTTP-записи

Все тестовые модули на рисунке 4 содержат сгенерированные Rational Performance Tester тестовые переменные. Они генерируются и задаются автоматически при делении теста для создания связей между тестовыми модулями. Кроме того, некоторые тестовые модули включают в себя заданные Rational Performance Tester переменные для использования последующими тестовыми модулями.

Деление HTTP-теста во время записи

Используя панель инструментов Rational Performance Tester Annotation, можно делить HTTP-тест в режиме реального времени в процессе записи. Во время записи теста при помощи панели инструментов Annotation можно вставлять в тест точки деления. После завершения записи Rational Performance Tester автоматически сгенерирует отдельные тестовые модули, основываясь на вставленных точках деления и предоставленных именах тестов.

Нотация и именование

  • Чтобы создавать сплит-тесты HTTP во время записи, необходимо установить в браузере панель инструментов Rational Performance Tester Annotation.
  • Вам будет предложено установить в браузере панель инструментов Annotation при первой после установки Rational Performance Tester записи HTTP-теста.
  • Используйте комментарии для аннотирования тестов во время записи. Это упростит их понимание и деление после записи.
  • Из записи, содержащей точки деления, можно восстановить единый полный тест.
  • При именовании имейте в виду, что имя присваивается сплит-тесту, сгенерированному для предыдущего, а не следующего, участка первоначального теста.

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

Кроме того, панель инструментов Annotation предоставляет дополнительные функциональные возможности, которые можно использовать для аннотирования теста во время записи. Она позволяет вставлять в тест комментарии и транзакции в режиме реального времени. Кроме того, вы можете использовать ее для переименования страниц во время записи, чтобы дать им более содержательные имена. Эти задачи также можно выполнить после записи теста, но зачастую удобнее и эффективнее делать это во время записи.

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

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

Рисунок 5. Панель инструментов Recorder Test Annotation
Рисунок 5. Панель инструментов Recorder Test Annotation 

Напоминания

  • При объединении тестовых модулей из разных записей HTTP-тестов всегда проверяйте сгенерированные Rational Performance Tester переменные сплит-тестов. Убедитесь, что переменные последующего тестового модуля были созданы и получили значения в тестовом модуле, который выполняется перед ним.
  • Очень важно документировать зависимости между тестовыми модулями. Это поможет при обслуживании и повторном использовании.
  • В каждом тесте можно использовать комментарии или поле описания свойств теста, связанное с каждым тестом, для документирования зависимостей и другой информации о тестах и расписаниях тестирования (далее - расписаниях).

Теперь, когда вы узнали об использовании предоставляемой Rational Performance Tester функциональности разделения тестов для создания сценариев модульных тестов, мы познакомим вас с тем, как использовать их в следующих целях:

  • Построение сценариев тестирования с использованием различных тестовых модулей.
  • Связывание различных тестовых модулей при помощи тестовых переменных, чтобы модули могли обмениваться данными.

Построение сценариев тестирования из тестовых модулей

Как показано на рисунках 2 и 4, тестовые модули можно создавать из тестов как во время записи, так и после нее. Каждый сплит-тест представляет собой взаимозаменяемый тестовый модуль. Такие модули можно реорганизовывать и объединять в сценарии большего или меньшего размера. На рисунке 6 показаны примеры использования различных тестовых модулей (от А до D) для создания различных сценариев тестирования. Также рисунок демонстрирует, что некоторые из модулей, такие как А и D, используются повторно в нескольких комбинациях сценариев.

Рисунок 6. Создание сценариев тестирования с использованием тестовых модулей
Рисунок 6. Создание сценариев тестирования с использованием тестовых модулей

Советы и рекомендации

Некоторые рекомендации по записи и делению сценариев тестирования:

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

Динамический обмен данными между тестами при помощи тестовых переменных

Функциональность тестовых переменных играет существенную роль в процессе деления теста. После деления записи теста на более мелкие тестовые модули становится необходим механизм для обмена данными между ними. Эту функциональность обеспечивают тестовые переменные, предоставляемые Rational Performance Tester. Вы можете определить переменную в одном тесте, чтобы получить и сохранить данные теста, а затем сослаться на тестовую переменную в другом тесте. Если установить для видимости (области действия) тестовой переменной значение All tests for this user (все тесты для данного пользователя), а не This test only (только данный тест), Rational Performance Tester сохранит значение тестовой переменной после окончания теста. При обращении к этой же тестовой переменной из будущего теста она будет иметь то же значение для данного виртуального пользователя при условии, что тестовая переменная была вновь определена с видимостью All tests for this user.

Использование тестовой переменной

С точки зрения программирования использование тестовой переменной в Rational Performance Tester аналогично другим языкам программирования. Вы можете объявлять и инициализировать тестовые переменные, устанавливать область их действия и изменять их значения. Отличие между использованием переменных в тестах Rational Performance Tester и других программах состоит в том, что все это можно делать с помощью графического пользовательского интерфейса, а программное обеспечение создаст программный код за вас. Кроме того, Rational Performance Tester предоставляет возможности обработки ошибок во время выполнения и совместного использования переменных тестовыми модулями.

Рисунок 7. Блок-схема использования тестовой переменной
Рисунок 7. Блок-схема использования тестовой переменной

Объявление переменных

Следующим шагом после определения тестовых модулей, которые вы хотите связать друг с другом, является объявление переменных и присвоение им соответствующих значений.

Процесс объявления переменной прост:

  1. Щелкните правой кнопкой мыши на контейнере Test Variables.
  2. Нажмите кнопку Add.
  3. Нажмите Variable Declaration и введите имя переменной.

Рисунок 8. Объявление переменной
Рисунок 8. Объявление переменной

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

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

Кроме того, у вас есть возможность обработки ошибок времени выполнения, если переменная не инициализирована. Вы можете ничего не предпринимать, можете занести ошибку или предупреждение теста в журнал, а можете выйти из теста. Хотя обработка ошибок времени выполнения не является обязательной, она важна при обмене данными между тестами. Если, например, ошибка произойдет в первом тесте, переменной не будет присвоено значение, в результате чего другие тесты получат пустое значение. См. пример на рисунке 9.

Область действия переменной

Тестовая переменная во время выполнения хранится в области данных. Ее область действия определяет, будет ли переменная видима для других тестов или нет.

На рисунках 7 и 9 показаны два варианта для настройки области действия переменной. Можно установить область действия переменной в This test only или в All tests for this user. Это похоже на локальные или глобальные (переменные класса) переменные в других языках программирования.

Рисунок 9. Настройка области действия переменных
Рисунок 9. Настройка области действия переменных 

Использование тестовых переменных

  • К тестовым переменным можно обращаться на протяжении всего теста, а их значения могут сохраняться между тестами.
  • Локальная тестовая переменная не сохраняется в области пользовательских данных во время выполнения. Она должна быть явно передана в пользовательский код в виде аргумента, а также может быть помещена в пользовательский код, возвращающий значение. На рисунке 11 приведен пример тестовой переменной, помещенной в пользовательский код, который возвращает значение.

Использование локальной переменной

Локальная переменная - это переменная, областью действия которой является только данный тест (опция This test only). На такую переменную можно ссылаться только в том тесте, в котором она объявлена, но не в других тестах. Это происходит потому, что набор данных одного теста невидим для других тестов, даже если другой тест содержит переменную с таким же именем. Локальная тестовая переменная доступна только при посредстве пользовательского кода.

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

Рисунок 10. Тестовая переменная инициализируется значением из пула данных
Рисунок 10. Тестовая переменная инициализируется значением из пула данных

Пользовательская переменная

Область действия пользовательской переменной устанавливается в All tests for this user, что делает переменную видимой для всех тестов, выполняемых одним и тем же виртуальным пользователем. На пользовательскую переменную можно ссылаться из другого теста, объявив переменную с тем же именем и установив ее область действия во втором тесте в All tests for this user. Чтобы переменная была видима для второго теста, область действия переменной в первом тесте также должна быть установлена в All tests for this user.

Общие переменные

  • Чтобы совместно использовать переменные в тестах, оба теста должны содержать переменную с одним и тем же именем и область действия обеих переменных должна быть установлена в All tests for this user.
  • Тестовые переменные являются общими для различных тестов одного и того же виртуального пользователя, но не для разных пользователей.
  • Пользовательские тестовые переменные хранятся в области данных пользователя. К ним можно обращаться и изменять их посредством пользовательского программного кода.
  • Всегда инициализируйте тестовые переменные и обрабатывайте ошибки времени выполнения.

Обработка ошибок времени выполнения для тестовых переменных очень важна, особенно при совместном использовании их с другими тестами. Существует возможность, что во время выполнения первого теста возникнут ошибки, и переменной не будет присвоено значение. Если переменная не инициализирована, вы должны решить, что делать дальше. Rational Performance Tester предоставляет следующие возможности (см. рисунок 7):

  • Ничего не делать.
  • Занести ошибку или предупреждение теста в журнал.
  • Выйти из теста.

На рисунках 11 и 12 приведены примеры передачи данных из одного теста в другой с помощью пользовательских тестовых переменных.

На рисунке 11 тестовая переменная orderNumber объявляется и инициализируется текстовой строкой no-value. Впоследствии ее значение устанавливается равным номеру заказа в пользовательском коде при помощи операции присваивания.

Рисунок 11. Пример использования тестовой переменной
Рисунок 11. Пример использования тестовой переменной

На рисунке 12 показан второй тестовый модуль (VA02), который использует переменную с тем же именем, что и тестовый модуль VA01. Тестовый модуль VA02 удаляет заказы, которые создает тестовый модуль VA01. В этом примере тестовый модуль VA02 ссылается на данные из теста VA01, а не, например, из пула данных, сгенерированного пользователем.

Рисунок 12. Ссылка на тестовую переменную из другого теста
Рисунок 12. Ссылка на тестовую переменную из другого теста

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

Моделирование рабочей нагрузки

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

На рисунке 13 приведен пример использования различных тестовых модулей для моделирования сценария рабочей нагрузки. В этом примере тестовые модули Login, Create order и Logout были получены из одного теста (VA01) при помощи функциональности разделения теста. Затем эти модули были объединены и скомбинированы с тестовым модулем Delete order (VA02), полученным из другого теста.

Структура сценария

При создании сценария важно придерживаться общей структуры теста.

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

Как уже было показано на рисунках 11 и 12, тестовые модули Create order и Delete order связаны между собой посредством тестовой переменной orderNumber .

Рисунок 13. Модельные сценарии с различными тестовыми модулями SAP
Рисунок 13. Модельные сценарии с различными тестовыми модулями SAP

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

При моделировании нагрузки с использованием записей HTTP-тестов всегда проверяйте переменные сплит-тестов, сгенерированные Rational Performance Tester, чтобы удостовериться, что переменные из последующих тестовых модулей создаются и получают значения в тестовом модуле, который выполняется перед ними.

Советы и рекомендации

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

Преимущества использования сплит-тестов и тестовых переменных

Вот лишь некоторые преимущества использования функциональности разделения тестов и тестовых переменных:

  • Получение тестовых модулей из одной записи при сохранении первоначального теста нетронутым.
  • Удаление из тестов лишних шагов для:
    • уменьшения размера тестов и затрат времени на обслуживание;
    • повышения надежности и повторного использования тестов;
    • упрощения отладки тестов.
  • Построение больших пользовательских сценариев путем преобразования и комбинирования тестовых модулей.
  • Ускорение изменения пользовательских сценариев, предназначенных для разных частей системы, при возникновении проблем.

Резюме

Эта статья посвящена созданию модульных тестов производительности при помощи предоставляемой IBM Rational Performance Tester функциональности разделения тестов с последующим обменом данными между тестовыми модулями с использованием функциональности тестовой переменной.

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

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

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

Модульность тестов дает ряд преимуществ:

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

Во второй части руководства представлен реальный пример использования тестовых переменных Rational Performance Tester. Изучите этот пример шаг за шагом, чтобы получить практический опыт.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 17.10.2011 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
IBM RATIONAL Quality Manager Quality Professional Authorized User Single Install License + Sw Subscription & Support 12 Months
IBM RATIONAL Clearcase Floating User License + Sw Subscription & Support 12 Months
IBM RATIONAL Clearcase Floating User From Rational Clearcase Lt Floating User Trade Up License + Sw Subscription & Support 12 Months
IBM Rational Functional Tester Floating User License
Rational ClearCase Multisite Floating User License
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Adobe Photoshop: алхимия дизайна
ЕRP-Форум. Творческие дискуссии о системах автоматизации
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100