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