什么是maven
Maven 是一款用于管理和构建Java项目的工具,是Apache旗下的一个开源项目 。
依赖管理
使用maven前
我们项目中要想使用某一个jar包,就需要把这个jar包从官方网站下载下来,然后再导入到项目中。然后在这个项目中,就可以使用这个jar包了。
使用maven后
当使用maven进行项目依赖(jar包)管理,则很方便的可以解决这个问题。 我们只需要在maven项目的pom.xml文件中,添加一段如下图所示的配置即可实现。
Maven坐标
什么是坐标?
Maven中的坐标是资源的唯一标识 , 通过该坐标可以唯一定位资源位置
使用坐标来定义项目或引入项目中需要的依赖
Maven坐标主要组成:
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
- artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
- version:定义当前项目版本号
SNAPSHOT: 功能不稳定、尚处于开发中的版本,即快照版本
RELEASE: 功能趋于稳定、当前更新停止,可以用于发行的版本
依赖配置
依赖:指当前项目运行所需要的jar包。一个项目中可以引入多个依赖:
- 在pom.xml中编写<dependencies>标签
- 在<dependencies>标签中使用<dependency>引入坐标
- 定义坐标的 groupId、artifactId、version
生命周期
Maven对项目构建的生命周期划分为3套(相互独立):
- clean:清理工作。
- default:核心工作。如:编译、测试、打包、安装、部署等。
- site:生成报告、发布站点等。
- clean:移除上一次构建生成的文件
- compile:编译项目源代码
- test:使用合适的单元测试框架运行测试(junit)
- package:将编译后的文件打包,如:jar、war等
- install:安装项目到本地仓库
单元测试
测试:是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
阶段划分:单元测试、集成测试、系统测试、验收测试。
1). 单元测试
介绍:对软件的基本组成单位进行测试,最小测试单位。
目的:检验软件基本组成单位的正确性。
测试人员:开发人员
2). 集成测试
介绍:将已分别通过测试的单元,按设计要求组合成系统或子系统,再进行的测试。
目的:检查单元之间的协作是否正确。
测试人员:开发人员
3). 系统测试
介绍:对已经集成好的软件系统进行彻底的测试。
目的:验证软件系统的正确性、性能是否满足指定的要求。
测试人员:测试人员
4). 验收测试
介绍:交付测试,是针对用户需求、业务流程进行的正式的测试。
目的:验证软件系统是否满足验收标准。
测试人员:客户/需求方
测试方法:白盒测试、黑盒测试 及 灰盒测试。
1). 白盒测试
清楚软件内部结构、代码逻辑。
用于验证代码、逻辑正确性。
2). 黑盒测试
不清楚软件内部结构、代码逻辑。
用于验证软件的功能、兼容性、验收测试等方面。
3). 灰盒测试
结合了白盒测试和黑盒测试的特点,既关注软件的内部结构又考虑外部表现(功能)。
Junit入门
单元测试
单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。
JUnit:最流行的Java测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司提供)
入门程序
需求:使用JUnit,对UserService中的业务方法进行单元测试,测试其正确性。
断言
JUnit提供了一些辅助方法,用来帮我们确定被测试的方法是否按照预期的效果正常工作,这种方式称为断言。
UserService
package org.example;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
public class UserService {
/**
* 给定一个身份证号, 计算出该用户的年龄
* @param idCard 身份证号
*/
public Integer getAge(String idCard){
if (idCard == null || idCard.length() != 18) {
throw new IllegalArgumentException("无效的身份证号码");
}
String birthday = idCard.substring(6, 14);
LocalDate parse = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyyMMdd"));
return Period.between(parse, LocalDate.now()).getYears();
}
/**
* 给定一个身份证号, 计算出该用户的性别
* @param idCard 身份证号
*/
public String getGender(String idCard){
if (idCard == null || idCard.length() != 18) {
throw new IllegalArgumentException("无效的身份证号码");
}
return Integer.parseInt(idCard.substring(16,17)) % 2 == 1 ? "男" : "女";
}
}
UserServiceTest
package org.example;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class UserServiceTest {
@BeforeAll
public static void beforeAll() {
System.out.println("Before All");
}
@AfterAll
public static void afterAll() {
System.out.println("After All");
}
@BeforeEach
public void beforeEach() {
System.out.println("Before Each");
}
@AfterEach
public void afterEach() {
System.out.println("After Each");
}
@Test
public void testgetage(){
UserService userService = new UserService();
Integer age = userService.getAge("100000200201301011");
System.out.println(age);
}
@Test
public void testgetsex(){
UserService userService = new UserService();
String sex = userService.getGender("100000200201301011");
System.out.println(sex);
}
// 断言
@Test
public void testgenderwithAssert(){
UserService userService = new UserService();
String sex = userService.getGender("100000200201301011");
//断言
Assertions.assertEquals("男",sex,"性别获取有问题");
}
@Test
public void testgenderwithAssert2(){
UserService userService = new UserService();
Assertions.assertThrows(IllegalArgumentException.class,()->{
userService.getGender(null);
});
}
@DisplayName("测试用户性别")
@ParameterizedTest
@ValueSource(strings = {"100000200201301011","100000200201301031","100000200201301051"})
public void testgetgender(String idCard){
UserService userService = new UserService();
String gender = userService.getGender(idCard);
Assertions.assertEquals("男",gender);
}
}
UserServiceaiTest
package org.example;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class UserServiceaiTest {
private UserService userService;
@BeforeEach
public void setUp() {
userService = new UserService();
}
@Test
@DisplayName("获取性别-空值")
public void testGetGender_NullInput_ThrowsException() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender(null);
});
}
@Test
@DisplayName("获取性别-空串")
public void testGetGender_EmptyString_ThrowsException() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender("");
});
}
@Test
@DisplayName("获取性别-长度不足")
public void testGetGender_LengthLessThan18_ThrowsException() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender("110");
});
}
@Test
@DisplayName("获取性别-长度超出")
public void testGetGender_LengthMoreThan18_ThrowsException() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender("1000002002013010111234");
});
}
@Test
@DisplayName("获取性别-正常男性")
public void testGetGender_ValidMaleIdCard_ReturnsMale() {
String gender = userService.getGender("100000200201301011");
Assertions.assertEquals("男", gender);
}
@Test
@DisplayName("获取性别-正常女性")
public void testGetGender_ValidFemaleIdCard_ReturnsFemale() {
String gender = userService.getGender("100000200201301021");
Assertions.assertEquals("女", gender);
}
}
UserService2Test
package org.example;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class UserService2Test {
private UserService userService;
@BeforeEach
public void setUp() {
userService = new UserService();
}
@Test
@DisplayName("获取性别-null值")
public void testGetGender1() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender(null);
});
}
@Test
@DisplayName("获取性别-空串")
public void testGetGender2() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender("");
});
}
@Test
@DisplayName("获取性别-长度不足")
public void testGetGender3(){
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender("110");
});
}
@Test
@DisplayName("获取性别-长度超出")
public void testGetGender4() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
userService.getGender("1000002002013010111234");
});
}
@Test
@DisplayName("获取性别-正常男性")
public void testGetGender5() {
String gender = userService.getGender("100000200201301011");
Assertions.assertEquals("男", gender);
}
@Test
@DisplayName("获取性别-正常男性")
public void testGetGender6() {
String gender = userService.getGender("100000200201301021");
Assertions.assertEquals("女", gender);
}
}