[Bug] Delete Test Artifacts on TFS (on-premises)

Trabalhar com implantação de processos e sistemas é sempre uma experiência muito rica. Ver um determinado processo/ferramenta afetar positivamente a vida das pessoas é o que há de mais gratificante na minha profissão. Contudo, o caminho nem sempre é perfeito, e as vezes achamos alguns buracos. E ninguém melhor para achar esses buracos que as próprias pessoas que estão fazendo parte do processo.

Recentemente um cliente entrou em contato pedindo ajuda pois um importante plano de testes seu havia "sumido" do TFS. Este cliente utiliza o TFS 2015.3 (on-premises). Eu tinha conhecimento que não era possível a exclusão de artefatos de teste no TFS, apenas no VSTS (Visual Studio Team Services). Ao tentar excluir um plano de testes sempre recebemos mensagens como esta:

Até mesmo para casos de teste:

Então consultei a documentação oficial para me certificar que nada havia mudado:

https://www.visualstudio.com/pt-br/docs/work/backlogs/remove-delete-work-items#delete-test-artifacts

Veja em destaque o Feature availability deixando explícito que essa funcionalidade somente está disponível para o Team Services (VSTS)...

Com todas essas informações em mãos, cheguei a pensar que o caso se tratava de um engano, que possivelmente esse plano de teste nunca havia existido. Mas resolvi buscar por evidências que pudessem comprovar o fato desse plano de testes ter existido.

O TFS possui um log de todos os comandos que cada um dos usuários executou nos últimos 14 dias. Esse log pode ser acessado pela url:

http://your-server:8080/tfs/_oi 

Para maiores detalhes consulte este post. Foi através do Activity Log que notei que vários usuários tinham executado um comando Plans.DeleteTestPlan Command!... Mas, de onde viria esse comando?

Imaginei que pudesse vir do Test Manager, mas constatei que no Test Manager não existe nem a opção de deletar planos de teste... Então teria que ter vindo do Web Portal mesmo. Voltei para o hub Test, comecei a explorar a interface quando notei um ícone de delete direto na Tree View dos planos de teste:

Cliquei no ícone e apareceu uma mensagem que não aparece quando tentamos deletar o plano de teste pelo formulário de workitem:

Após confirmar, o plano de testes foi realmente deletado. Acessei o Activity Log novamente o confirmei a existência de um novo registro do comando Plans.DeleteTestPlan Command com o meu usuário. Bingo! Uma inconsistência na interface.

Entrei em contado com o time dos Rangers, e disseram se tratar de um problema conhecido, que foi tratado no VSTS mas que não foi corrigido a tempo de ser disponibilizado para o versão RTM do TFS 2017. Essa correção irá fazer parte do Update 1 mas, até a data de publicação deste post, todas as versões de TFS possuem esse bug.

Mas o que consiste este bug de fato?

Historicamente a parte de testes do TFS sempre foi um módulo separado dos workitems. Era possível criar links, mas não era possível fazer queries relacionando Test Cases, etc. Isto porque as informações de testes são armazenadas em uma estrutura diferente de workitems. Os testes são armazenados no Test Case Management (TCM) Data Store, os workitems na Workitem Data Store. Quando decidiu-se tratar os artefatos de teste como workitems (para habilitar queries, facilitar rastreabilidade, relatórios, etc), foi criada uma correspondência entre um workitem de teste e um artefato de teste da TCM Data Store.

O bug consiste no fato de o delete que está disponível na tree view de planos de teste, deletar apenas da TCM Data Store, deixando o workitem correspondente "órfão". Isto pode ser comprovado criando uma query que filtra por workitems do tipo TestPlan (acessando Queries no hub Work):

Veja que o workitem do plano de teste ainda existe e está ativo! Mas o problema para por aí. Ao realizar queries o plano de teste irá aparecer, pois as queries operam sobre workitems. Contudo, não existe o risco de alguém utilizar um plano de testes que foi deletado, pois o módulo de testes, tanto no web portal quanto no Test Manager, acessam a TCM Data Store, e o plano não irá aparecer pois foi deletado na TCM Data Store.

Um workaround para corrigir essa inconsistência, e que deve ser utilizado por administradores do TFS até que a correção seja disponibilizada, é limpar os workitems de teste que ficaram "órfãos" utilizando o comando witadmin para destruir esses workitems, e assim garantir a consistência:

witadmin destroywi /collection:http://your-server:8080/tfs/your-collection /id:id-test-plan

Fiquem atentos, relatórios feitos a partir de queries ou consultando direto a base de dados dos workitems, poderão estar inconsistentes. E não se assustem se alguém usando TFS disser que um plano de testes ou suite de testes "sumiu"... realmente é possível. :-)