Тестирование ПО. Тестирование. Реферат актуальность. Основной всплеск интереса к теме тестирования пришёлся на 90е годы и начался в сша. Бурное развитие систем автоматизированной разработки
Скачать 2.21 Mb.
|
Шаги: срабатывает повторяющийся код - открывается страница "Данные об организации"; заполняются поля "название организации, ОПФ, ОВД; нажимается кнопка "Далее"; после перехода на новую страницу нажимается кнопка "Назад"; проверка, что все поля заполнены старыми значениями. Весь набор тест кейсов для данной страницы можно посмотреть в приложении Б. В итоге, данный проект сильно ускорил регрессионное тестирование и выпуск обновлений. Скорость прохождения тестов увеличена почти в 2 раза. Перед каждым апдейтом тесты проходят на тестовой площадке и только после их успешного выполнения происходит обновление на "боевой". 111 ЗАКЛЮЧЕНИЕ В ходе выполнения работы был изучен процесс тестирования программного обеспечения в IT-компаниях. Были рассмотрены большинство видов дефектов в ПО, причины возникновения и способы их отслеживания, с помощью систем отслеживания ошибок. Также изучены способы создания и применения тест кейсов для черного ящика. Данный материал можно использовать как для учебных целей, так и для успешного прохождения технического собеседования для устройства на работу в качестве тестировщика. Также по данному материалу можно оформить методическое пособие для студентов и включить в программу обучения в качестве дополнительного курса "Тестирование ПО". Во второй части работы рассмотрены программы для нагрузочного тестирования. C помощью программы JMeter проведено нагрузочное тестирование веб-сервиса "Эксперт", в котором было обнаружено слабое звено в системе. Были разработаны 2 проекта по автоматизированному функциональному тестированию. Первый проект учебный и несет ознакомительный характер. Он нацелен на пользу начинающему тестировщику — автоматизатору, помочь быстро создать первый авто-тест и продолжить автоматизировать. Второй, - проект по авто-тестам для веб-сервиса "Эксперт", который сейчас используется на боевом сервере. Он сильно ускорил регрессионное тестирование и выпуск обновлений. Перед каждым апдейтом тесты проходят на тестовой площадке и только после их успешного выполнения происходит обновление на "боевой". 112 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Библиотека MSDN. Источник информации для разработчиков, использующих средства, продукты, технологии и службы корпорации Майкрософт. [Электронный ресурс]. – Режим доступа: http://msdn.microsoft.com 2. КиберФорум. Форум начинающих и профессиональных программистов, системных администраторов, администраторов баз данных. [Электронный ресурс]. – Режим доступа: http://cyberforum.ru 3. ИНТУИТ. Интернет университет информационных технологий. [Электронный ресурс]. – Режим доступа: http://intuit.ru 4. Клуб программистов. [Электронный ресурс]. – Режим доступа: http://www.cyberguru.ru/ 5. ВикипедиЯ. Свободная энциклопедия. [Электронный ресурс]. – Режим доступа: http://ru.wikipedia.org/wiki 6. Тестирование и качество ПО. [Электронный ресурс]. - Режим доступа: http://software-testing.ru/ 7. Про тестинг. [Электронный ресурс]. Режим доступа: http://www.protesting.ru/ 8. SQA Days. [Электронный ресурс]. Режим доступа: http://sqadays.com/ 9. Software testing training and stoftware testing services. [Электронный ресуср]. Режим доступа: http://www.rbcs-us.com/ 10. Уиттакер Д., Арбон Д., Каролло Д. Как тестирует Google.: Пер. с англ. - Спб.: Издательский дом "Питер", 2014.-320с 11. Савин Р. Тестирование Дот Ком, или Пособие по жесткому обращению с багами в интернет- стартапах. - М.: Дело, 2007. - 312с 12. Хабрахабр. [Электронный ресурс]. Режим достуа: http://habrahabr.ru/ 13. Code Project. Сообщество разработки программного обеспечения. [Электронный ресурс]. – Режим доступа: http://codeproject.com 14. Apache Software Foundation. [Электронный ресурс]. - Режим доступа: http://jmeter.apache.org/ 15. SeleniumHQ Browser Automation. [Электронный ресурс]. - Режим доступа: http://docs.seleniumhq.org/ 113 ПРИЛОЖЕНИЕ А Программный код, описывающий инфраструктуру страницы "Данные об организации": package pages.fa_pages import pages._ import intro_pages._ import org.openqa.selenium.WebDriver import queries._ import expert_elements._ import org.scalatest.Matchers import common._ import popups_and_lightboxes._ import utils.StringEnumeration import pages.pages_constants.SkipperConstants import org.scalatest.selenium.WebBrowser import pages.pages_constants._ object OrgTypes extends StringEnumeration { val empty = StringValue( "…" ) val OOO = StringValue( "Общество с ограниченной ответственностью" ) val OAO = StringValue( "Открытое акционерное общество" ) val ZAO = StringValue( "Закрытое акционерное общество" ) val UP = StringValue( "Унитарное предприятие" ) val ODO = StringValue( "Общество с дополнительной ответственностью" ) val PT = StringValue( "Полное товарищество" ) val TV = StringValue( "Товарищество на вере" ) val PK = StringValue( "Производственный кооператив" ) val KKH = StringValue( "Крестьянское (фермерское) хозяйство" ) val NKO = StringValue( "Некоммерческая организация" ) val IP = StringValue( "Индивидуальный предприниматель" ) val OBPUL = StringValue( "Организация без прав юридического лица" ) } trait FaCompanyInfoPageBackground[Intro <: ExpertPage, Result <: ExpertPage] extends BackgroundPageComponent { type BackgroundPage = FaCompanyInfoPage[Intro, Result] val backgroundPageConstructor = implicitly[Constructable[FaCompanyInfoPage[Intro, Result]]].construct } trait FaCompanyInfoPageSaved[Intro <: ExpertPage, Result <: ExpertPage] extends SavedPageComponent { type SavedPage = FaCompanyInfoPage[Intro, Result] val savedPageConstructor = new FaCompanyInfoPage[Intro, Result](_ : String) } class FaOnvdSelector[Intro <: ExpertPage, Result <: ExpertPage]()( implicit val driver : WebDriver) extends OnvdSelectorLightBoxComponent with FaCompanyInfoPageBackground[Intro, Result] with FaCompanyInfoPageSaved[Intro, Result] { val lightbox = new OnvdSelectorLightBox(_) } /* * YearDependentPage ‐ if 2010, then Fa2010BalancePage, otherwise ‐ FaBalancePage */ 114 class FaCompanyInfoPage[Intro <: ExpertPage, Result <: ExpertPage] (url : String, val isPeriodSelected : Boolean = false )( implicit val driver : WebDriver) extends FaFormPage(url) with BreadCrumbs[Intro] with Matchers with IncompleteSaver with ExpertEventually { val companyTitle = new ExpertInput(ByJQ( "input#company_title" )) val orgType : ExpertSelect[OrgTypes. type ] = new ExpertSelect(ByJQ( "select#org_type" )) val onvd = new ExpertText(ByJQ( "#selected_business_type_title" )) protected lazy val faOnvdSelector = new FaOnvdSelector[Intro, Result] lazy val onvdCodeSelectorLink = new ExpertLink(ById( "select_business_type" )) with Connector[ faOnvdSelector .OnvdSelectorLightBox] { val construction = faOnvdSelector lightbox } lazy val onvdSelectedCodeSelectorLink = new ExpertLink(ById( "change_business_type" )) with Connector[ faOnvdSelector .OnvdSelectorLightBox] { val construction = faOnvdSelector lightbox } val wizardStepPage = "Данные об организации" val companyNameValidation = "Укажите название" val orgTypeValidation = "Заполните поле" val onvdCodeValidation = "Укажите основной вид деятельности" lazy val moneyUnitValidation = "Переключение единиц измерения невозможно — значения должны быть целыми числами" def checkCompanyNameValidation() = checkText(ByJQ( "label[for='company_title']" ), companyNameValidation ) def checkOrgTypeValidation() = checkText(ByJQ( "label[for='org_type']" ), orgTypeValidation ) def checkOnvdCodeValidation() = checkText(ByJQ( "label[for='onvd_code']" ), onvdCodeValidation ) private def checkText(textElementSelector: ExpertQuery, expectedText: String) { new ExpertText(textElementSelector).text should be (expectedText) } override def accept() { checkText(ByJQ( "div#company_info h1" ), wizardStepPage ) currentStep should be ( "Данные об организации" ) } lazy val moneyUnitElement = new ExpertText(ByJQ( ".units‐error" )) lazy val unitOfMeasure = new ExpertSelect[UnitsOfMeasure. type ](ById( "units" )) def chooseThousandsUnit : FaCompanyInfoPage[Intro, Result] = { unitOfMeasure .select(UnitsOfMeasure. thousands ) new FaCompanyInfoPage(url) } def chooseMillionsUnit : FaCompanyInfoPage[Intro, Result] = { unitOfMeasure .select(UnitsOfMeasure. millions ) new FaCompanyInfoPage(url) } def checkMoneyValidation() { moneyUnitElement .text should be ( moneyUnitValidation ) } lazy val nextPageInactive = new ExpertButton(ByJQ( "#buttons_pane a.b‐button‐small" )) } 115 object FaCompanyInfoPage extends WebBrowser { type CompanyPageTypeConstructor[Intro <: ExpertPage, ResultPage[_ <: ExpertPage] <: ExpertPage] = FaCompanyInfoPage[Intro, ResultPage[Intro]] def apply[Intro <: ExpertPage, Result <: ExpertPage, YearDependentPage <: ExpertPage](url : String) ( implicit driver : WebDriver) = new FaCompanyInfoPage[Intro, Result](url) implicit def FaCompanyInfoPageToConstructable[Intro <: ExpertPage, Result <: ExpertPage] ( implicit driver : WebDriver) = new Constructable[FaCompanyInfoPage[Intro, Result]] { def construct = new FaCompanyInfoPage[Intro, Result](_ : String) } def FaCompanyInfoPageDefault[Intro <: ExpertPage, Result <: ExpertPage](url : String) ( implicit driver: WebDriver) = new FaCompanyInfoPage[Intro, Result](url)(driver) type DefaultType[Intro <: ExpertPage, Result <: ExpertPage] = FaCompanyInfoPage[Intro, Result] implicit def FaCompanyInfoPageToNextStep[Intro <: ExpertPage, Result <: ExpertPage] (current : FaCompanyInfoPage[Intro, Result])( implicit driver : WebDriver) = new FaCompanyInfoPage[Intro, Result](current. url ) with WizardNextStep[FaCompanyInfoPage[Intro, Result], FaBalancePage[Intro, Result]] { override val nextPageConstructor = implicitly[Constructable[FaBalancePage[Intro, Result]]].construct } implicit def FaCompanyInfoPageToPrevStep[Intro <: ExpertPage : Constructable, Result <: ExpertPage] (current : FaCompanyInfoPage[Intro, Result])( implicit driver : WebDriver) = new FaCompanyInfoPage[Intro, Result](current. url ) with WizardPrevStep[FaCompanyInfoPage[Intro, Result], Intro] { override protected val prevPageConstructor = implicitly[Constructable[Intro]].construct } } 116 ПРИЛОЖЕНИЕ Б Программный код, который содержит набор тест кейсов для страницы "Данные об организации": package test_cases.fa_tests import test_cases._ import pages.intro_pages._ import pages.fa_pages._ import expert_elements._ import queries._ import pages.pages_constants._ class FaCompanyInfoSpec extends ExpertSpec { protected def setup = { IntroPage(). new_fa .proceed().chooseManual.selectPeriod(Years. year2013 , PeriodTypes. year ) } "Click next with empty fields than fill onvd code ‐ all fields" should "be valid" in { val companyInfoPage = setup companyInfoPage nextPageInactive .click() companyInfoPage .checkCompanyNameValidation() companyInfoPage .checkOnvdCodeValidation() companyInfoPage .checkOrgTypeValidation() companyInfoPage onvdCodeSelectorLink .proceed().checkOnvd( "15" ) withWait() { new ExpertText(ByJQ( "label[for='company_title']" ))} withWait() { new ExpertText(ByJQ( "label[for='org_type']" ))} withWait() { new ExpertText(ByJQ( "label[for='onvd_code']" ))} } "Fill all fields except onvd ‐ validation" should "appear on onvd field" in { val companyInfoPage = setup companyInfoPage companyTitle .text = OrgName. name companyInfoPage orgType .select(OrgTypes. ODO ) companyInfoPage nextPageInactive .click() companyInfoPage .checkOnvdCodeValidation() } "Fill all fields, click next than return back ‐ all fields" should "be filled" in { val companyInfoPage = setup companyInfoPage companyTitle .text = OrgName. name companyInfoPage orgType .select(OrgTypes. ODO ) companyInfoPage onvdCodeSelectorLink .proceed().checkOnvd( "15" ). nextPage .proceed(). backwardLin k .proceed() companyInfoPage companyTitle .text should be (OrgName. name ) companyInfoPage orgType .getSelected should be (OrgTypes. ODO .toString()) companyInfoPage onvd .text should be ( "15. Производство пищевых продуктов, включая напитки" ) } "Click next with empty fields, fill OrgType than reset and select again OrgType ‐ all fields" should "be valid" in { val companyInfoPage = setup 117 companyInfoPage nextPageInactive .click() companyInfoPage orgType .select(OrgTypes. ODO ) withWait() { new ExpertText(ByJQ( "label[for='company_title']" ))} withWait() { new ExpertText(ByJQ( "label[for='org_type']" ))} withWait() { new ExpertText(ByJQ( "label[for='onvd_code']" ))} companyInfoPage orgType .select(OrgTypes. empty ) companyInfoPage nextPageInactive .click() companyInfoPage orgType .select(OrgTypes. ODO ) withWait() { new ExpertText(ByJQ( "label[for='company_title']" ))} withWait() { new ExpertText(ByJQ( "label[for='org_type']" ))} withWait() { new ExpertText(ByJQ( "label[for='onvd_code']" ))} } } |