Cette entrée suppose que vous utilisez Lombok, qui génère le code source, et l'outil de mesure de la couverture Jacoco. Je vais préparer un échantillon et présenter comment augmenter la couverture en).
Le but de cette entrée est de servir de point de départ pour augmenter la couverture dans Jacoco sans écrire autant de code que possible en utilisant Lombok. Il n'explique pas toutes les fonctions de chaque outil.
En conclusion, excluons le code généré automatiquement de la cible d'inspection de couverture en spécifiant "lombok.addLombokGeneratedAnnotation = true" du côté lombok en utilisant Jacoco 0.8.0 (publié le 1/2/2018) ou supérieur. , Est un gros point.
À Qiita, à propos de Lombok, Jacoco
[Recherche par Qiita](https://qiita.com/search?utf8= ✓ & sort = & q = lombok), il y en avait 347.
[Recherche par Qiita](https://qiita.com/search?utf8= ✓ & sort = & q = jacoco), il y en avait 79.
Il y en a beaucoup (au 26 mai 2018), mais ce qui suit sera utile.
À titre d'exemple, j'ai créé Spring Boot pour stocker et afficher des entités simples via le contrôleur REST.
Cela fonctionne comme ça.
(enregistrement)
$ curl -H 'Content-Type:application/json' -d '{"intField":123}' http://localhost:8080
(référence)
$ curl http://localhost:8080/
[{"id":"2815cfc6-f908-4c7d-a20b-b2c52953555f","intField":123,"longField":0,"stringField":null,"charField"
(1 détail)
$ curl http://localhost:8080/2815cfc6-f908-4c7d-a20b-b2c52953555f
{"id":"2815cfc6-f908-4c7d-a20b-b2c52953555f","intField":123,"longField":0,"stringField":null,"charField":"\u0000","byteField":0}hirokis-M
Il est stocké dans Référentiel d'état initial.
Dans cette version, il est implémenté sans utiliser les fonctions pratiques de lombok.
$ ./gradlew test
$ ./gradlew jacocoTestReport
La couverture ressemble à ceci.
@ Data
SampleEntity.java
public class SampleEntity {
private SampleId id;
private int intField;
private long longField;
private String stringField;
private char charField;
private byte byteField;
/**
* @return the id
*/
public SampleId getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(SampleId id) {
this.id = id;
}
/**
* @return the intField
*/
public int getIntField() {
return intField;
}
/**
* @param intField the intField to set
*/
public void setIntField(int intField) {
this.intField = intField;
}
/**
* @return the longField
*/
public long getLongField() {
return longField;
}
/**
* @param longField the longField to set
*/
public void setLongField(long longField) {
this.longField = longField;
}
/**
* @return the stringField
*/
public String getStringField() {
return stringField;
}
/**
* @param stringField the stringField to set
*/
public void setStringField(String stringField) {
this.stringField = stringField;
}
/**
* @return the charField
*/
public char getCharField() {
return charField;
}
/**
* @param charField the charField to set
*/
public void setCharField(char charField) {
this.charField = charField;
}
/**
* @return the byteField
*/
public byte getByteField() {
return byteField;
}
/**
* @param byteField the byteField to set
*/
public void setByteField(byte byteField) {
this.byteField = byteField;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + byteField;
result = prime * result + charField;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + intField;
result = prime * result + (int) (longField ^ (longField >>> 32));
result = prime * result
+ ((stringField == null) ? 0 : stringField.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SampleEntity other = (SampleEntity) obj;
if (byteField != other.byteField)
return false;
if (charField != other.charField)
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (intField != other.intField)
return false;
if (longField != other.longField)
return false;
if (stringField == null) {
if (other.stringField != null)
return false;
} else if (!stringField.equals(other.stringField))
return false;
return true;
}
/**
* @param id
* @param intField
* @param longField
* @param stringField
* @param charField
* @param byteField
*/
public SampleEntity(SampleId id, int intField, long longField,
String stringField, char charField, byte byteField) {
super();
this.id = id;
this.intField = intField;
this.longField = longField;
this.stringField = stringField;
this.charField = charField;
this.byteField = byteField;
}
public SampleEntity() {
super();
};
}
SampleEntity.java
@Data
public class SampleEntity {
private SampleId id;
private int intField;
private long longField;
private String stringField;
private char charField;
private byte byteField;
}
Si vous vérifiez avec l'IDE (Eclipse dans cette entrée) auquel le plug Lombok est appliqué, vous pouvez voir que le setter, le getter, toString et hashCode sont générés.
@ RequiredArgsConstructor
Lors de l'injection d'un champ avec @Autowired of Spring, il peut être gênant de le remplacer directement pour le test, etc., ou cela peut prendre de la place quand il y a beaucoup de choses à utiliser, alors injectez-le avec le constructeur. Je vais le changer.
SampleApi.java
@RestController
@RequestMapping("/")
public class SampleApi {
@Autowired
private SampleFacade sampleFacade;
SampleApi.java
@RestController
@RequestMapping("/")
@RequiredArgsConstructor
public class SampleApi {
private final SampleFacade sampleFacade;
Jusqu'à présent, le rapport jacoco ressemble à ceci.
Ici, le package de domaine est une bonne proportion, mais si vous regardez à l'intérieur, c'est naturellement le code généré automatiquement par lombok. Lorsque le comportement de lombok est positif, cela n'a pas beaucoup de sens de tester ce qui est généré.
Pour cette raison, spécifions d'exclure le code généré par Lombok du test. Placez le fichier suivant dans le répertoire du projet et recommencez le test.
lombok.config
lombok.addLombokGeneratedAnnotation = true
$ ./gradlew clean
$ ./gradlew test
$ ./gradlew jacocoTestReport
Et la couverture change comme ça. La situation rouge n'a pas changé depuis que je n'ai pas encore écrit le code de test, mais la zone de domaine a été considérablement réduite et l'instruction de code globale a été considérablement réduite de 731 à 170.
Une description des valeurs pouvant être spécifiées dans lombok.config peut être trouvée sur le site officiel de lombok.
J'ai mis ce qui précède comme v0.2 sur GitHub.
Dans le test unitaire, la couverture est définie à 100% en passant 1 passage pour le moment Sample on GitHub v0.3 Ce sera /releases/tag/v0.3).
(Référence) Maintenant, si vous restaurez (ne spécifiez pas) le paramètre d'exclusion, cette situation se produira.
Dans cette entrée, j'ai vu comment exclure le code généré automatiquement par lombok des mesures de couverture, et j'ai montré à travers un exemple de code au point où cela fonctionne réellement.
En plus d'utiliser la fonction lombok dans l'exemple de cette entrée, Divers sur le site d'origine a été introduit, je voudrais donc présenter un exemple d'utilisation à un autre moment. pense.