// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Видео 'Использование TestNG в IDE NetBeans'
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Видео 'Использование TestNG в IDE NetBeans' - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Видео 'Использование TestNG в IDE NetBeans'

|===
|В этой экранной демонстрации показано, как создать и отладить тестовый класс TestNG в IDE NetBeans. В целях демонстрации создается простой тест TestNG, затем в тестовом классе создается поставщик данных для предоставления параметров, используемых в тесте. Также в этом видео демонстрируется использование команды 'Шаг без захода в выражение' при отладке тестового класса.

Автор: Кен Гэнфилд (Ken Ganfield) 
Продолжительность: 5:20

link:http://bits.netbeans.org/media/testng-screencast.mp4[+Смотреть видео полностью/Загрузить+] (.mp4) (Ctrl-Click для загрузки, 31 МБ)


link:/about/contact_form.html?to=3&subject=Feedback:%20Video%20of%20Using%20TestNG%20in%20NetBeans%20IDE[+Отправить отзыв по этому учебному курсу+]
 |  
|===


== Связанные ссылки

* link:junit-intro.html[+Writing JUnit Tests in IDE NetBeans+]
* link:debug-visual.html[+Использование визуального отладчика+]
* Демонстрация: link:debug-multithreaded-screencast.html[+Отладка многопотокового приложения в IDE NetBeans+]
* Демонстрация: link:debug-stepinto-screencast.html[+ визуальная операция Step Into в отладчике NetBeans+]
* Демонстрация: link:debug-deadlock-screencast.html[+обнаружение взаимоблокировки с помощью отладчика NetBeans+]
