先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
正文
我们可以遵循以下 5个步骤来创建参数化测试方法。
- 用 @RunWith(Parameterized.class)来注解 test 类;
- 创建一个由 @Parameters 注解的公共静态方法,返回**一个对象的集合(数组)**来作为测试参数的数据集合;
- 创建一个公共的构造函数,接收和测试数据相等的内容;
- 为每一个测试数据创建一个实例变量;
- 用实例变量作为测试数据的来源来创建你的测试用例。
//1.更改默认的测试运行器为RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class ParameterTest {
// 2.声明存放预期值和测试数据的变量
private String firstName;
private String lastName;
//3.声明一个返回值为Collection的公共静态方法,并使用@Parameters注解进行修饰
@Parameterized.Parameters
public static List<Object[]> param() {
//这里给出了两个测试用例
return Arrays.asList(new Object[][]{{"Mike", "Black"}, {"Cilcln", "Smith"}});
}
//4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
public ParameterTest(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// 5. 进行测试,发现它会将所有的测试用例测试一遍
@Test
public void test() {
String name = firstName + " " + lastName;
assertThat("Mike Black", is(name));
}
}
11. JUnit中使用assertThat断言
JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。
#语法
assertThat( [actual], [matcher expected] );
assertThat 使用了 Hamcrest 的 Matcher 匹配符,用户可以使用匹配符规定的匹配规则,来精确的指定一些想要设定满足的条件,具有很强的易读性,而且使用起来更加灵活。
四. SpringBoot中的测试功能
1. SpringBoot中的测试依赖包
Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的集成测试。而在 Spring Boot 中,我们可以通过spring-boot-starter-test启动器快速开启和使用它。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2. 创建测试类
// 获取SpringBoot启动类,加载配置,确定装载 Spring 程序的装载方法,它会去寻找 主配置启动类(也就是被 @SpringBootApplication 注解的类)
@SpringBootTest
// 让 JUnit 运行 Spring 的测试环境,获得 Spring 上下文环境的支持。
@RunWith(SpringRunner.class)
public class OrderTest {
// ...
}
3. SpringBoot中实现测试的方式
在SpringBoot中实现测试功能,我们可以利用以下4种方式进行相关的测试实现。
- **@WebMvcTest注解:**针对单个的Spring MVC控制器实现单元测试,该方式不需要完整启动 HTTP 服务器就可以快速测试 MVC 控制器;
- **@SpringBootTest注解:**该方式可以启动一个完整的 HTTP 服务器,对整个Spring Boot 的 Web 应用编写测试代码。
- **@DataJpaTest注解:**使用 @DataJpaTest注解表示只对 JPA 进行测试。
- **Mockito方式:**对于一些不容易构造的、或者和这次单元测试无关但是上下文又有依赖的对象,用一个虚拟的对象(Mock对象)来模拟,以便单元测试能够进行。
4. @WebMvcTest注解对单个Controller进行单元测试
如果我们想对 Spring MVC 控制器编写单元测试代码时,可以使用@WebMvcTest注解。它提供了自配置的 MockMvc,可以不需要完整启动 HTTP 服务器,就能够快速测试 MVC 控制器。
4.1 构建一个测试用的Controller
@RestController
@RequestMapping(value = "/order", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping
public ResponseEntity<List<OrderResult>> listAll() {
return ResponseEntity.ok(orderService.findOrders());
}
}
4.2 编写 MockMvc 的测试类
@RunWith(SpringRunner.class)
@WebMvcTest(OrderController.class)
public class OrderControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private OrderService orderService;
public void setUp() {
// 数据打桩,设置该方法返回的 body一直是空的
Mockito.when(orderService.findOrders())
.thenReturn(new ArrayList<>());
}
@Test
public void listAll() throws Exception {
mvc.perform(MockMvcRequestBuilders
.get("/order"))
.andExpect(status().isOk()) // 期待返回状态吗码200
// JsonPath expression https://github.com/jayway/JsonPath
//.andExpect(jsonPath("$[1].name").exists()) // 这里是期待返回值是数组,并且第二个值的 name 存在,所以这里测试是失败的
.andDo(print()); // 打印返回的 http response 信息
}
}
注意
在我们使用@WebMvcTest注解时,只有部分Bean 能够被扫描得到,它们分别是:
- @Controller
- @ControllerAdvice
- @JsonComponent
- Filter
- WebMvcConfigurer
- HandlerMethodArgumentResolver
其他常规的@Component(包括@Service、@Repository等)Bean 则不会被加载到 Spring 的测试上下文环境中。
4.3 注入Spring上下文环境到 MockMvc中
可以如下编写 MockMvc 的测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderControllerTest {
/**
* Interface to provide configuration for a web application.
*/
@Autowired
private WebApplicationContext ctx;
private MockMvc mockMvc;
/**
* 初始化 MVC 的环境
*/
@Before
public void before() {
//使用 WebApplicationContext构建 MockMvc
mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
}
@Test
public void listAll() throws Exception {
mockMvc.perform(get("/order") // 测试的相对地址
.accept(MediaType.APPLICATION_JSON_UTF8))// accept response content type
.andExpect(status().isOk()) // 期待返回状态吗码200
// JsonPath expression https://github.com/jayway/JsonPath
.andExpect(jsonPath("$[1].name").exists()) // 这里是期待返回值是数组,并且第二个值的 name 存在
.andDo(print()); // 打印返回的 http response 信息
}
}
5. @SpringBootTest测试完整Web应用
当我们想启动一个完整的 HTTP 服务器,对 Spring Boot 的 Web 应用编写测试代码时,可以使用@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
注解开启一个随机的可用端口。
Spring Boot 针对 REST 调用的测试,提供了一个 TestRestTemplate 模板,它可以解析链接服务器的相对地址。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class OrderControllerTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void listAll() {
// 由于这里返回的是 List 类型数据,可以使用 exchange 函数进行类型转换。
ParameterizedTypeReference<List<OrderResult>> type = new ParameterizedTypeReference<List<OrderResult>>() {};
ResponseEntity<List<OrderResult>> result = restTemplate.exchange("/order", HttpMethod.GET, null, type);
Assert.assertThat(result.getBody().get(0).getName(), Matchers.notNullValue());
}
}
6. @DataJpaTest测试JPA
我们可以使用 @DataJpaTest注解对 JPA 进行测试,其中@DataJpaTest注解只会扫描@EntityBean和装配了Spring Data JPA 的存储库,其他常规的@Component(包括@Service、@Repository等)Bean 则不会被加载到 Spring 的上下文测试环境中。
@DataJpaTest 提供了两种测试方式:
- 使用内存数据库 h2Database,Spring Data Jpa 测试默认采取的就是这种方式;
- 使用真实环境的数据库。
6.1 使用内存数据库测试
默认情况下,@DataJpaTest使用的是内存数据库进行测试,我们无需配置和启用真实的数据库,只需要在 pom.xml 配置文件中声明如下依赖即可:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
编写测试方法:
@RunWith(SpringRunner.class)
@DataJpaTest
public class OrderDaoTest {
@Autowired
private OrderDao orderDao;
@Test
public void testSave() {
Order order = new Order();
OrderDetail detail = new OrderDetail();
detail.setName("tv");
order.setDetail(detail);
assertThat(detail.getName(), Matchers.is(orderDao.save(order).getDetail().getName()));
}
}
6.2 使用真实数据库测试
如要需要使用真实环境中的数据库进行测试,则需要替换掉默认的规则,使用@AutoConfigureTestDatabase(replace = Replace.NONE)
注解。
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class OrderDaoTest {
@Autowired
private OrderDao orderDao;
@Test
public void testSave() {
Order order = new Order();
OrderDetail detail = new OrderDetail();
detail.setName("tv");
order.setDetail(detail);
assertThat(detail.getName(), Matchers.is(orderDao.save(order).getDetail().getName()));
}
}
6.3 事务控制
当我们执行上面新增数据的测试时,可能会发现测试正常通过,但是数据库却并没有新增数据。原因是默认情况下,在每个 JPA 测试结束时,事务会发生回滚,这样可以在一定程度上防止测试数据污染数据库。
但是如果我们不希望事务发生回滚,可以使用@Rollback(false)注解,该注解可以标注在类级别做全局的控制,也可以标注在某个特定的不需要执行事务回滚的方法上。
另外我们也可以显式的使用 @Transactional注解,设置事务和事务的控制级别,放大事务的范围。
7. Mockito模拟对象
JUnit和SpringTest基本上可以满足绝大多数的单元测试了,但是由于现在的系统越来越复杂,相互之间的依赖越来越多,特别是微服务化以后的系统,往往一个模块的代码需要依赖几个其他模块的东西。
因此,我们在做单元测试的时候,往往很难构造出需要的依赖。一个单元测试,我们只关心一个小的功能,但是为了这个小的功能能跑起来,可能需要依赖一堆其他的东西,这就导致了单元测试无法进行。所以,我们就需要再测试过程中引入Mock测试。
所谓的Mock测试就是在测试过程中,对于一些不容易构造的、或者和这次单元测试无关但是上下文又有依赖的对象,用一个虚拟的对象(Mock对象)来模拟,以便单元测试能够进行。
比如有一段代码的依赖为:
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-KSoqtvza-1713404932899)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!