Maison  >  Article  >  Java  >  Comment implémenter les tests unitaires SpringBoot+TestNG

Comment implémenter les tests unitaires SpringBoot+TestNG

王林
王林avant
2023-05-16 16:16:191762parcourir

Contexte

En raison du calendrier serré des tâches de développement et de l'interface incomplète et des données de base, même si un scénario de test d'interface complet est conçu, il est impossible d'effectuer des tests de couverture complets et efficaces et en raison de la direction d'un scénario de test d'interface unique ; la conception est constituée des paramètres d'entrée et des paramètres de sortie. À partir des paramètres d'entrée se trouvent la vérification des paramètres requis, le type de paramètre et la valeur limite du paramètre, puis la combinaison des paramètres d'entrée, par exemple, une interface a 5 paramètres, 3 requis, 2 facultatifs, et le type de données est string , int, etc., ainsi que des restrictions de longueur de caractères, donc le nombre de ces cas de test à interface unique sera conçu, euh... trop pour être compté si le nombre de paramètres d'entrée et de paramètres. les types augmentent, alors Ce nombre est indescriptible, il est donc nécessaire de prendre en compte la maîtrise par le testeur des méthodes de conception de cas de test d'interface.

Les cas de test d'interface sont conçus pour les paramètres d'entrée :

1. Paramètres de type numérique

Division de classe d'équivalence : dans la plage de valeurs, en dehors de la plage de valeurs
Comment comprendre cela ? Quelles valeurs ou plages choisir, choisissez simplement entre l'intérieur et l'extérieur de la plage spécifiée ici
Analyse des valeurs limites : le maximum et le minimum sont justes, le maximum +1, le minimum -1, il s'agit de trouver la limite à partir du plage de valeurs, où le maximum et le minimum sont les limites du type de données
Conception de valeur spéciale : 0 ou nombres non positifs, des décimales peuvent être conçues
Traversal : pas de raccourcis, épuisez la plage de valeurs, celle-ci sera généralement filtrée par classes d'équivalence et valeurs limites, et n'a pas besoin d'être épuisé ;

2. Type de chaîne

Longueur de chaîne
Classe d'équivalence : à l'intérieur et à l'extérieur de la plage de valeurs
Valeur limite : limite de type de plage spécifiée ; parmi les caractères spéciaux du type chaîne, fait ici référence à 0 ou chaîne vide, null
Contenu de la chaîne
Types spécifiques : chinois et anglais, majuscules et minuscules, chinois simplifié et traditionnel
Caractères spéciaux : emoji, symboles de ponctuation, autres caractères spéciaux de la méthode de saisie

3. Types de tableaux rares ou de listes chaînées : comme le type de liste, il peut s'agir de int[] ou de string[]. Ses méthodes de conception ne peuvent pas échapper à celles ci-dessus, je n'entrerai donc pas dans les détails ici.

Conception pour la logique métier, conception pour les paramètres de sortie, etc. En particulier, la logique métier adopte généralement une conception de cas d'utilisation avancée, et un petit nombre de scénarios anormaux sont conçus via des paramètres d'entrée. La conception des paramètres de sortie peut presque atteindre les résultats escomptés. conception des paramètres d’entrée.

Retour aux affaires !

1. Utilisez Eclipse localement comme outil de développement Java et prenez en charge la programmation de l'environnement Python, vous ne souhaitez donc pas utiliser Pycharm et IDEA en même temps

<!-- 首先创建springboot框架的maven项目pom添加如下依赖,ide可以安装插件:spring assistant,一键创建springboot框架的maven项目 -->

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.4.0</version><!-- 2.3.0.RELEASE版本可选 -->
   <relativePath/> <!-- lookup parent from repository -->
</parent>

<!-- springboot框架的主要依赖 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <version>2.4.0</version>
</dependency>

conseils : @SpringBootApplication@RestController@RequestMapping et autres annotations

 ; 2. Importez l'environnement de développement local, Eclipse Vous devez installer le plug-in Lombok en externe. Ajoutez des paramètres au bas du fichier de configuration Eclipse Eclipse.ini : -javaagent:lombok.jar, avec une adresse de téléchargement en plus de l'installation. , et si l'équipe Java a configuré les dépendances dans le pom

<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
    <version>1.18.12</version>
 <optional>true</optional>
</dependency>

3 Je teste Staff, le plug-in jacoco a été installé dans l'environnement d'origine, donc le plug-in a également été ajouté au projet maven 056e62d4d7d2131df775d6a7718dcf97 :

<!-- 顺带提一下的另一个做代码覆盖率检测的插件 -->
<dependency>
 <groupId>org.codehaus.mojo</groupId>
 <artifactId>cobertura-maven-plugin</artifactId>
 <version>2.7</version>
</dependency>

<plugin>
      <groupId>org.jacoco</groupId>
      <artifactId>jacoco-maven-plugin</artifactId>
      <version>0.8.3</version>
      <configuration>
     <!--指定生成 .exec 文件的存放位置 -->
     <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
     <!--Jacoco 是根据 .exec 文件生成最终的报告,所以需指定 .exec 的存放路径 -->
            <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
     </configuration>
     <executions>
         <execution>
  <id>jacoco-initialize</id>
           <goals>
               <goal>prepare-agent</goal>
            </goals>
         </execution>
         <execution>
  <id>jacoco-site</id>
           <phase>package</phase>
            <goals>
             <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<!-- tips:jacoco在maven中执行的命令是:mvn clean jacoco:prepare-agent install jacoco:report -Dmaven.test.failure.ignore=true -->

4. Auparavant, Java était utilisé pour aider les tests jmeter À cette époque, j'étais habitué au framework de tests unitaires testng, et je n'avais pas encore fait de tests unitaires sur le framework springboot, les dépendances suivantes ont donc dû être ajoutées au fichier pom :

<dependency>
    <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>

<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
 <groupId>org.testng</groupId>
 <artifactId>testng</artifactId>
 <version>6.9.10</version>
</dependency>
<!-- 右键选择Coverage as 执行框架即可,运行完在指定目录或当前控制台查看覆盖率 -->

5 Le développement est habitué à utiliser junit4.x pour les tests unitaires, qui est également utilisé. Le plug-in spring-boot-starter-test. hérite uniquement de différentes classes ;

# junit4.x是如下使用:

import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class BaseTest  {
}

# 而换成testng就是如下使用:
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;

@SpringBootTest
public class BaseTest extends AbstractTestNGSpringContextTests {
}

# 同样是使用@SpringBootTest注解,但是它启动sprintboot服务不一样,testng必须继承AbstractTestNGSpringContextTests使用;
# 扩展:还可以是继承AbstractTransactionalTestNGSpringContextTests类,二选一;
# @SpringBootTest(classes={是你的SpringBoot启动app类}),例如:@SpringBootTest(classes=UserApplication.class)

6. À ce stade, vous pouvez appuyer sur Ctrl+1 sur Eclipse pour convertir les cas de test du framework junit en framework testng pour des tests heureux : Convertir en TestNG (Annotations) ; : ajoutez une dépendance swagger et générez des documents d'interface ; la dépendance lombok prend en charge les méthodes getter et setter des champs déclarés, et intègre également des outils tels que Log log.


Ne lisez pas mon article pour la suite, cela dépend de vos propres performances. Le cas de test unitaire est le suivant :

package  com.text;

import xxx.xxx.xxx

public TestSampler extends BaseTest{
    
    @BeforeClass
    void bf(){
        // 测试写测试的前置条件,那些只需要执行一次的数据
    }
    @Test
    void test_add(){
        // 这里写需要测试的代码
    }
    
//    。。。
}
.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer