3. Recovery-система

Назад Содержание Дальше

При разработке часто может возникнуть необходимость написания кода, который позволит подготовить тестовую среду к запуску скриптов или вообще выполнить некоторые предварительные действия. Например, возникает необходимость выставить определенные настройки SilkTest-а исходя из конфигурации конкретной машины, на которой нужно провести тестинг. Настройки могут зависеть от операционной системы, языка системы и т.д. Бывают также случаи, когда нужно проинициализировать некоторые глобальные переменные. Зачастую эти величины нужно считывать из какого-то файла в определенном формате. В качестве примера можно привести величину, означающую количество секунд, с течение которых ожидается появление некоторого окна. Естественно, можно завести подобную переменную и задать ей некоторое значение явно. Но в разных средах тестируемое приложение работает с разными скоростями. Где-то приложение работает быстро, а где-то очень медленно. Соответственно на ожидание окна потребуется разное время. Как следствие – переменная, хранящая это время ожидания может быть инициализирована по-разному. Но постоянно править файл, в котором объявлена данная переменная, не очень хорошо. Более того, значения подобных варьируемых величин лучше выносить в некоторый отдельный файл и все настройки осуществляеются только в этом файле.

 

Теперь нужно обеспечить инициализацию таких данных перед запуском скриптов. Одним из вариантов является разработка функции или тесткейса, который осуществит необходимую инициализацию и запустить его перед запуском других тесткейсов. Но у этого варианта есть недостатки. Каждый тесткейс может запускаться как в группе ( тестпланом например ) так и поодиночке. Во втором случае инициализацию данных придется интегрировать в каждый тесткейс, что не очень хорошо. Более удобным вариантом будет помещение инициализации данных в appstate. Соответственно, данные будут готовы до того, как тесткейс начнет выполнение. Данный механизм вполне эффективен, если appstate всего один. Но если их несколько и они не пересекаются по выполняемым действиям, то этот подход уже хуже работает. Более того, appstate вызывается столько раз, сколько вызывается тесткейсов, хотя зачастую инициализацию достаточно произвести один раз при запуске всей группы тесткейсов, находящихся в одном файле ( например при нажатии F9 в файле, содержащем только тесткейсы ). Плюс ко всему appstate может сам использовать некоторые величины, которые уже должны быть проинициализированы.

 

В любом случае, нужно реализовать некоторую функцию, которая сработает до того, как какой-либо тесткейс вообще начнет работу. Для таких целей в SilkTest-е существует так называемая Recovery-система. Данная система реализована в виде набора функций:

  • ScriptEnter – выполняется в самом начале выполнения файла скрипта
  • ScriptExit – выполняется сразу по завершении выполнения файла скрипта
  • TestCaseEnter – выполняется сразу перед началом выполнения отдельного тесткейса (до appstate)
  • TestCaseExit – выполняется сразу после завершения тесткейса ( после appstate)
  • TestPlanEnter – выполняется сразу перед началом выполнения тестплана
  • TestPlanExit – выполняется сразу после выполнения тестплана

Это набор функций, который нужно переопределить. Если какая-то из этих функций не переопределена, то задействуются функции по-умолчанию (DefaultScriptEnter, DefaultScriptExit, DefaultTestCaseEnter, DefaultTestCaseExit, DefaultTestPlanEnter, DefaultTestPlanExit).

 

В начале данной главы Recovery-система преподносилась как средство для выполнения некоторого кода до начала выполнения тесткейса. Но как видно из вышеприведенного перечня функций данной системы, также возможно выполнение действий и после выполнения отдельного тесткейса или целого скрипта. Особенностью Exit-функций данной системы является то, что они принимают параметром BOOLEAN-значение, которое позволяет установить, завершилась ли работа скрипта, тесткейса, тестплана в результате генерации исключения. Это достаточно полезно, при генерации исключения в скриптах ( при условии, что исключение не перехватывается ) происходит просто обрыв выполнения без надлежащей выдачи информации. А Recovery-система подобную ситуацию может отследить и предоставляет возможность выдать необходимую информацию.

 

Рассмотрим действие данной системы. Определим функции Recovery-системы так, чтобы они выдавали в отчет результаты своей работы. Примерно так:

Code

[+] ScriptEnter()
	[ ] Print( "Script Enter" )
[ ] 
[+] ScriptExit( BOOLEAN bException )
	[+] if( bException )
		[ ] LogError( "Script Exit by Exception" )
		[ ] ExceptPrint()
		[ ] raise 1,"Exception in Script Exit"
	[+] else
		[ ] Print( "Script Exit" )
[ ] 
[+] TestCaseEnter()
	[ ] Print( "Testcase Enter" )
	[ ] DefaultTestCaseEnter()
[ ] 
[+] TestCaseExit( BOOLEAN bException )
	[+] if( bException )
		[ ] LogError( "TestCase Exit by Exception" )
		[ ] ExceptPrint()
	[+] else
		[ ] Print( "TestCase Exit" )
	[ ] DefaultTestCaseExit(bException)
[ ] 
[+] TestPlanEnter()
	[ ] Print("TestPlan Enter")
[ ] 
[+] TestPlanExit( BOOLEAN bException )
	[+] if( bException )
		[ ] LogError( "TestPlan Exit by Exception" )
		[ ] ExceptPrint()
	[+] else
		[ ] Print( "TestPlan Exit" )
	
	

 

В данном случае функции Recovery-системы просто выдают сообщение о том, что та или иная функция вызвана. Поместим этот код в некоторый файл, напрмер Recovery.inc. Создадим некоторый тестовый t-файл (например RecTest.t) , в котором напишем 2 тесткейса: первый пройдет успешно, а второй сгенерирует исключение. Файл имеет вид:

Code

[ ] use "Recovery.inc"
[ ]
[+] appstate TestAppstate() basedon none
	[ ] Print("Appstate. Testcase state: {GetTestcaseState()}")
[ ] 
[+] testcase UsualTest() appstate TestAppstate
	[ ] Print("Usual Test running...")
[ ] 
[+] testcase ExceptionTest() appstate TestAppstate
	[ ] raise 0,"Test exception"
	

 

Таким образом мы сейчас можем проверить очередность вызовов функций Recovery-системы, appstate-ов и тесткейсов. Запустим тесткейс UsualTest отдельно ( выбираем меню Run > Testcase, в появившемся окне выберем тесткейс UsualTest и нажмем кнопку Run). После выполнения, файл результатов будет содержать следующие строки:

Code

[ ] Script Enter
[+] Testcase UsualTest - Passed
	[ ] Testcase Enter
	[ ] Appstate. Testcase state: TCS_ENTERING
	[ ] Usual Test running...
	[ ] TestCase Exit
	[ ] Appstate. Testcase state: TCS_EXITING
[ ] Script Exit
	

 

Итак, из результатов видно, что последовательность вызовов такова:

  1. ScriptEnter
  2. TestCaseEnter
  3. TestAppstate
  4. UsualTest
  5. TestCaseExit
  6. TestAppstate
  7. ScriptExit

Во 2-й главе говорилось, что appstate вызывается сразу до и сразу после выполнения тесткейса, но результаты последнего запуска показывают, что TestCaseExit выполняется до TestAppstate. Поэтому нужно разобраться, как же appstate взаимодействует с Recovery-системой. В файле Recovery.inc закомментируем вызовы DefaultTestCaseEnter() и DefaultTestCaseExit(bException). Повторим предыдущий запуск. На этот раз результаты имеют вид:

Code

[ ] Script Enter
[+] Testcase UsualTest - Passed
	[ ] Testcase Enter
	[ ] Usual Test running...
	[ ] TestCase Exit
[ ] Script Exit
	

 

То же самое, только appstate не выполнился. Получается, что в Default-функциях Recovery-системы как раз и обеспечивается запуск appstate. Вы можете в этом убедиться, если посмотрите файл defaults.inc в директории, в которой находится SilkTest. В данном файле как раз и определены функции DefaultTestCaseEnter() и DefaultTestCaseExit(bException). Таким образом appstate запускается при помощи Recovery-системы. Можно, конечно, и обойти это путем вызова функции SetAppState() в функциях TestCaseEnter и TestCaseExit, но все-таки предпочтительнее пользоваться стандартными механизмами.

 

Раскомментируем вызовы Default-функций в Recovery.inc и рассмотрим поведение Recovery-системы при других видах запуска скриптов ( помимо индивидуального ). Итак, перейдем к файлу Test.t и запустим все тесткейсы с помощью клавиши F9. Вывод будет иметь вид:

Code

[ ] Script Enter
[+] Testcase UsualTest - Passed
	[ ] Testcase Enter
	[ ] Appstate. Testcase state: TCS_ENTERING
	[ ] Usual Test running...
	[ ] TestCase Exit
	[ ] Appstate. Testcase state: TCS_EXITING
[+] Testcase ExceptionTest - 2 errors
	[ ] Testcase Enter
	[ ] Appstate. Testcase state: TCS_ENTERING
	[ ] TestCase Exit by Exception
	[ ] Test exception
	[ ] Occurred in ExceptionTest at Test.t(575)
	[ ] Test exception
	[ ] Occurred in ExceptionTest at Test.t(575)
	[ ] Appstate. Testcase state: TCS_EXITING
[ ] Script Exit
	

 

Как видно, ScriptEnter/Exit-функции вызвались по разу. Также функцией TestCaseExit было перехвачено исключение, сгенерированное в тесткейсе ExceptionTest. Аналогичные результаты будут получены, если эти оба тесткейса будут вызываться функцией main().

 

И последний способ запуска, который будет рассмотрен – это запуск тесткейсов в тестплане. А в тестплан можно включить не только тесткейс-функцию, но и обычную функцию. В файле Test.t допишем тестовую функцию:

Code

[+] VOID FunctionException()
	[ ] raise 0,"Function Exception"
	

 

Эта функция будет генерировать исключение, что позволит нам отследить, какая функция Recovery-системы это исключение перехватит. Создадим файл тестплана Test.pln со следующим содержимым:

Code

[+] script: Test.t
	[+] 1
		[ ] testcase: UsualTest()
	[+] 3
		[ ] testcase: FunctionException()
	[+] 2
		[ ] testcase: ExceptionTest()
	

 

Теперь этот файл можно запустить нажатием на F9. Результаты будут иметь вид:

Code

	[+] 1
		[ ] TestPlan Enter
		[ ] Script Enter
		[ ] Testcase Enter
		[ ] Appstate. Testcase state: TCS_ENTERING
		[ ] Usual Test running...
		[ ] TestCase Exit
		[ ] Appstate. Testcase state: TCS_EXITING
		[ ] Script Exit
	[+] 3
		[ ] Script Enter
		[ ] Script Exit by Exception
		[ ] Function Exception
		[ ] Occurred in FunctionException at Test.t(578)
		[ ] Exception in Script Exit
		[ ] Occurred in ScriptExit at Test.t(542)
	[+] 2
		[ ] Script Enter
		[ ] Testcase Enter
		[ ] Appstate. Testcase state: TCS_ENTERING
		[ ] TestCase Exit by Exception
		[ ] Test exception
		[ ] Occurred in ExceptionTest at Test.t(575)
		[ ] Test exception
		[ ] Occurred in ExceptionTest at Test.t(575)
		[ ] Appstate. Testcase state: TCS_EXITING
		[ ] Script Exit
		[ ] TestPlan Exit

	

 

Как видно из результатов, функции TestPlanEnter/Exit вызываются по разу в самом начале и в самом конце работы тестплана соответственно. Вызовы функций TestCaseEnter/Exit и ScriptEnter/Exit осуществляются парно для тесткейсов, за исключением запуска функции FunctionException, которая тесткейсом не является. Для последней, исключение перехватывается в функции ScriptExit. В этом состоит очередное отличие обычных VOID-функций от тесткейсов: тесткейсы имеют стандартную привязку к Recovery-системе посредством функций TestCaseEnter и TestCaseExit.

 

Подведем итог: Recovery-система – это система функций, которые позволяют проводить подготовку среды к тестированию, подготавливают тестируемое приложение и приводят его в некоторое начальное состояние до начала выполнения тесткейсов, а также восстанавливают настройки, параметры и восстанавливают начальное состояние тестируемого приложения после выполнения тесткейсов. При этом данные действия могут выполняться до и после начала работы тесткейса, захода в файл или работы тестплана, что позволяет подготавливать среду на разных этапах работы скриптов.


Назад Содержание Дальше