• Nenhum resultado encontrado

7.3

A Especificação Monitored Test Execution utilizando

TLA+

A especificação para ilustrar uma execução de teste na qual as threads são monitoradas de acordo com a abordagem Thread Control for Tests está apresentada no Apêndice B. Essa es- pecificação foi escrita em um arquivo texto chamadoMonitoredTestExecution.tla

e então formatada para impressão usando o TLATeX. A sintaxe dessa especificação também foi checada pelo analisador sintático de TLA+.

O módulo definido nesse arquivo incorpora as definições do módulo TestExecution pre- viamente explicado. Isso foi feito utilizando a palavra-chave EXTENDS. As ações a se- rem redefinidas foram especificadas no módulo TestExecution utilizando a palavra-chave

LOCAL.

A idéia básica dessa especificação é que ela incorpora as idéias da abordagem Thread

Control for Tests para evitar asserções antecipadas e tardias através de monitoração de th-

reads durante transições de estado importantes. Isso foi representado na especificação por algumas mudanças principais em algumas ações definidas na especificação Test Execution:

Algumas ações tiveram de mudar para incluir em suas pré-condições a verificação

de que a thread do teste deve estar rodando: Thread 1Runs, Thread 1StartsToWait, Thread 1 FinishesRunning, Thread 2Runs, Thread 2StartsToWait, Thread 2Finishes Running, Thread 3Runs, Thread 3StartsToWait, Thread 3FinishesRunning. Essa mudança foi feita para evitar asserções tar- dias, as quais acontecem quando a thread muda seu estado enquanto verificações (asserções) estão sendo feitas. Fazendo essa mudança na especificação da execução de um teste corresponde a considerar a fase 4 de teste da abordagem Thread Control

for Tests (“execução das asserções, sem temer que alguma thread desperte e execute

operações que afetem os resultados de teste"). Essas ações alteradas, quando habili- tadas, correspondem à fase 2 de uma execução de teste, em que operações do sistema estão sendo invocadas, exercitando assim o sistema e fazendo as transições de estado das threads acontecerem.

7.3 A Especificação Monitored Test Execution utilizando TLA+ 113

que as threads do sistema sendo testado devem estar waiting ou finished , o que é uma situação comum para momentos apropriados de realizar asserções (quando todas as threads estão esperando ou finalizadas). Dessa forma, asserções antecipadas podem ser evitadas já que a execução só entrará no bloco de asserções quando estiver no momento certo de realizar a asserção. A definição de um momento apropriado para realizar asserções corresponde à fase 1 da abordagem Thread Control for Tests, que é a preparação do ambiente indicando o estado esperado no qual asserções podem ser executadas. O uso de tais estados como pré-condições para habilitar o passo que faz com que o estado da thread do teste se torne verifying corresponde à fase 3 da abordagem (“espera até que o estado esperado para o sistema, especificado na fase 1, tenha sido alcançado").

A ação AssertionPerfomed da especificação Test Execution foi substituída pela

ação AssertionNotEarly. A ação anterior estava considerando como pré-condição o fato de que o estado da thread de teste poderia ser running ou verifying (den- tro de um bloco de asserções) já que em uma execução de threads sem monitora- ção uma asserção pode ocorrer antes que o teste espere que ela ocorra. No módulo MonitoredTestExecution, a ação AssertionNotEarly só é habilitada quando o estado da thread de teste (threadsStates.tState0) é verifying , o que indica que a execução da asserção ocorre dentro de um bloco de asserções, depois da verificação sobre se o estado esperado para o sistema foi atingido.

A ação AssertionNotEarly foi definida da seguinte forma: AssertionNotEarly ∆

^pthreadsStates.tState0verifyingq ^UNCHANGED threadsStates

Para que o estado da thread de teste esteja verifying e a asserção possa ocorrer, a asserção só poderá ser feita dentro de um bloco de asserções, delimitado pelos passos StartAssertionsBlock e FinishAssertionsBlock . A ação StartAssertionsBlock foi rede- finida no arquivoMonitoredTestExecution.tlada seguinte forma:

StartAssertionsBlock ∆

7.3 A Especificação Monitored Test Execution utilizando TLA+ 114

^pthreadsStates.tState2finished _threadsStates.tState2waitingq ^pthreadsStates.tState3finished _threadsStates.tState3waitingq ^pthreadsStates.tState0runningq

^threadsStates 1

rthreadsStates EXCEPT !.tState0verifyings

Como se vê, o sistema só consegue executar o passo de entrar em um bloco de asserções quando suas threads estiverem esperando ou finalizadas e quando isto ocorre, a thread do teste passa para o estado verifying .

A ação FinishAssertionsBlock não foi alterada na especificação Monitored Test Exe-

cution. A idéia principal dessa ação é que ela é habilitada quando a thread de teste está

verifying e ela muda o valor da variável threadStatespara running novamente. Isso corresponde à fase 5 de uma execução de teste utilizando a abordagem Thread Control

for Tests, na qual a execução de teste prossegue de forma que o sistema possa ser exer-

citado novamente e novas asserções possam ser feitas ou o teste possa terminar. No ar- cabouço de testes ThreadControl, essa ação corresponde à primitiva de teste proceed. O início de um bloco de asserção é representado no arcabouço pela invocação do método

waitUntilStateIsReached.

Considerando as ações declaradas no arquivoMonitoredTestExecution.tla, a relação de próximo estado TEnxt2 do módulo MonitoredTestExecution é definida da se- guinte forma: TEnxt2 ∆ _TestStarts _Thread 1Starts _Thread 1Runs _Thread 1FinishesRunning _Thread 1StartsToWait _Thread 2Starts _Thread 2Runs _Thread 2FinishesRunning _Thread 2StartsToWait _Thread 3Starts _Thread 3Runs

7.3 A Especificação Monitored Test Execution utilizando TLA+ 115 _Thread 3FinishesRunning _Thread 3StartsToWait _NothingHappens _AssertionNotEarly _StartAssertionsBlock _FinishAssertionsBlock

A especificação Monitored Test Execution (TE 2) pode ser resumida pela seguinte fór- mula temporal:

TE 2 ∆ TEini ^2rTEnxt2s

xthreadsStatesy

Os teoremas considerados nessa especificação são os seguintes:

THEOREM TE 2 ñ2TypeInvariant

THEOREM TE 2 ñ2NotEarlyOrLateAssertion

Esses teoremas afirmam que quando se considera a especificação de Execu- ção de Teste Monitorada (TE2), isso implica que as invariantes TypeInvariant e NotEarlyOrLateAssertion são sempre verdadeiras. Isso significa que asserções antecipadas ou tardias não acontecem e que todos os estados possíveis respeitam os estados válidos para as threads do sistema sob teste (tunstarted , started , running, waiting and finishedu) e para