Implementação do SpotBugs Plugin
Criação do projeto Maven
Use spotbugs-archetype para criar o projeto Maven. Então, a arquitetura do Maven plugin pede para que você informe o groupId, artifactId, package e versão inicial do plugin.
$ mvn archetype:generate \
-DarchetypeArtifactId=spotbugs-archetype \
-DarchetypeGroupId=com.github.spotbugs \
-DarchetypeVersion=0.2.3
Escrita do código Java para representar o bug a ser encontrado
No projeto gerado, você pode encontrar um arquivo nomeado como BadCase.java. Atualize esse arquivo para representar o bug a ser encontrado.
Se você tem muitos padrões a serem representados, adicione mais classes no diretório src/test/java
.
Escreva casos de teste para garantir que seu detector pode encontrar bugs
No projeto gerado, você pode encontrar o arquivo nomeado como MyDetectorTest.java. Nesse teste, o spotbugs.performAnalysis(Path)
executa o SpotBugs com o seu plugin, e retorna todos os bugs encontrados (o primeiro argumento desse método é o caminho do arquivo de classe compilado a partir de BadCase.java
).
Você pode usar BugInstanceMatcher para verificar que seu plugin pode encontrar bug como o esperado.
Atualmente, esse teste deve falhar, porque não atualizamos o detector ainda.
Escrita de código Java para evitar falso-positivos
Para evitar falso positivos, é bom garantir os casos em que o detector NÃO deve encontrar um bug.
Atualize GoodCase.java no seu projeto, e represente tais casos. Em seguida, adicione um método de teste em MyDetectorTest.java
o qual verifica que não foram encontradas instâncias de bug na classe GoodCase
.
Se você tem muitos padrões a serem representados, adicione mais classes no diretório src/test/java
.
Atualize o detector para passar em todos os testes de unidade
Agora você tem testes que garantem que seu detector funciona como o esperado.
Nota
TBU
Qual super classe você deve escolher
- AnnotationDetector
Um detector base que analisa anotações em classes, campos, métodos e parâmetros de método.
- BytecodeScanningDetector
Um detector base que analisa Java bytecode em arquivos de classe.
- OpcodeStackDetector
É uma subclasse de
BytecodeScanningDetector
. Você pode verificar o bytecode do método e usar a pilha de operandos.
Atualizar o findbugs.xml
O SpotBugs lê o arquivo findbugs.xml
em cada plugin para encontrar os detectores e bugs.Portanto, ao adicionar um novo detector, você precisa adicionar o novo elemento <Detector>
da seguinte maneira :
<Detector class="com.github.plugin.MyDetector" reports="MY_BUG" speed="fast" />
Você também precisa adicionar <BugPattern>
para descrever o tipo e a categoria do padrão de bug.
<BugPattern type="MY_BUG" category="CORRECTNESS" />
você pode encontrar o arquivo findbugs.xml
no diretório src/main/resources
do projeto Maven gerado
Atualizar messages.xml
O SpotBugs lê o arquivo messages.xml
em cada plugin e cria uma mensagem legível por humanos para relatar os bugs detectados. Além disso, ele também suporta a leitura de mensagens localizadas em messages_ja.xml
, messages_fr.xml
e etc.
Você pode encontrar o arquivo messages.xml
no diretório src/main/resources
do projeto Maven gerado.
Atualizar a mensagem do Detector
Você pode adicionar uma mensagem descritiva no elemento <Detector>
. Observe que a mensagem deve ser texto simples, HTML não é suportado.
<Detector class="com.github.plugin.MyDetector">
<Details>
Original detector to detect MY_BUG bug pattern.
</Details>
</Detector>
Atualizar a mensagem de Bug Pattern
Você pode adicionar uma mensagem descritiva no elemento <BugPattern>
. Há três tipos de mensagens:
- ShortDescription
Apresenta uma breve descrição de um padrão de bug. Essa mensagem é útil para comunicar as intenções e o caráter para os usuários. Deve ser texto simples e HTML não é compatível.
- LongDescription
Apresenta uma descrição mais longa do padrão de bug. Você pode usar um espaço reservado como
{0}
(0-índice) e os dados de BugInstance serão inseridos nesse espaço. Portanto, oLongDescription
é útil para fornecer informações detalhadas sobre os bugs encontradosDeve ser texto simples e HTML não é compatível.
- Detalhes
Uma descrição detalhada do padrão de bug. Deve estar no formato HTML para comunicar especificações/exemplos detalhados em tabelas, listas e fragmentos de código.
<BugPattern type="MY_BUG">
<ShortDescription>Explain bug pattern shortly.</ShortDescription>
<LongDescription>
Explain existing problem in code, and how developer should improve their implementation.
</LongDescription>
<Details>
<![CDATA[
<p>Explain existing problem in code, and how developer should improve their implementation.</p>
]]>
</Details>
</BugPattern>