Java测试方法进阶:从单元测试到集成测试的完整实践指南
1. 项目概述为什么“测试方法”是Java进阶的必修课在Java开发这条路上很多朋友在掌握了基础语法、集合框架和Spring全家桶之后会感觉遇到了瓶颈。代码能跑功能也能实现但总觉得自己写的程序不够“健壮”或者面对一个复杂的遗留系统时不知从何下手去验证其正确性。这时“测试”就不再是书本上那个被一笔带过的章节而是决定你代码质量和职业高度的分水岭。我见过太多项目前期为了赶进度而忽视测试后期却要花费数倍的时间在深夜排查那些幽灵般的Bug。因此深入理解并实践Java的测试方法是每一位开发者从“会写代码”到“写好代码”的关键一跃。所谓的“Java进阶-测试方法”远不止是学会用JUnit写几个Test那么简单。它是一套完整的工程化思维和保障体系涵盖了单元测试、集成测试、端到端测试等多个层次涉及测试框架选型、Mock技术、测试数据管理、持续集成流水线设计等一系列核心技能。掌握它意味着你能主动为自己的代码质量设立防线能自信地进行重构而不担心引入回归错误也能在团队协作中输出更可靠、更易维护的代码资产。无论你是正在准备面试被“如何保证代码质量”这类问题所困扰还是在实际工作中苦于测试代码的编写与维护这篇文章都将为你提供一个从理论到实战的完整视角。2. 测试体系全景与核心思想拆解在动手写第一行测试代码之前我们必须建立起正确的“测试观”。测试不是开发完成后可有可无的附加动作而是驱动设计、保障质量的核心开发活动。2.1 测试金字塔构建高效测试策略的基石测试金字塔是一个经典模型它形象地说明了不同粒度测试的理想数量分布。自底向上分别是单元测试Unit Tests金字塔的底座数量最多。专注于测试单个类或方法一个“单元”的行为通常运行速度极快毫秒级。其目标是验证代码逻辑在隔离环境下的正确性。集成测试Integration Tests金字塔中层数量适中。测试多个模块或组件之间的交互是否正确例如Service层调用DAO层、微服务间的HTTP调用。它会涉及真实的数据库、消息队列等外部依赖。端到端测试E2E Tests金字塔顶端数量最少。模拟真实用户操作测试整个应用流程例如通过浏览器自动化工具测试一个完整的下单流程。它覆盖最全但速度最慢、最脆弱。很多团队的测试策略是“倒金字塔”或“冰淇淋筒”形状——即E2E测试过多单元测试不足。这会导致测试套件运行缓慢且一旦UI或接口稍有变动大量测试就会失败维护成本极高。正确的做法是大力投资单元测试用大量快速、低成本的单元测试覆盖核心业务逻辑用适量的集成测试验证模块间契约最后用少量的E2E测试保障关键用户旅程畅通。这样构建的测试套件才是高效且可持续的。2.2 优秀单元测试的FIRST原则如何写出好的单元测试FIRST原则提供了清晰的指导F - Fast快速测试必须能快速执行。如果运行一次测试需要几分钟开发者就不会频繁运行它反馈周期变长测试也就失去了意义。I - Isolated隔离测试之间不应该有依赖关系也不应依赖外部环境如数据库、网络。一个测试的成功或失败不应影响其他测试。这通常需要通过Mock或Stub来实现。R - Repeatable可重复在任何环境开发机、CI服务器下每次运行测试都应该产生相同的结果。这意味着要避免使用随机数据或者对外部服务有强依赖。S - Self-validating自验证测试应该能自动判断通过还是失败无需人工检查日志或输出。这就是断言Assertion的作用。T - Timely及时理想情况下测试代码应该与生产代码同步编写测试驱动开发TDD最晚也应在功能代码完成后立即编写。事后补写的测试往往困难且效果不佳。遵循这些原则你的测试代码本身也会变得清晰、可维护成为项目的宝贵财富而非负担。3. 核心工具链深度解析与选型工欲善其事必先利其器。Java生态的测试工具非常丰富正确的选型和搭配能事半功倍。3.1 测试框架JUnit 5 的现代特性JUnit 5是目前绝对的主流它由三个子项目组成JUnit Platform启动测试的基础、JUnit Jupiter新的编程模型和扩展模型、JUnit Vintage兼容JUnit 3/4。我们主要关注Jupiter。核心注解进阶用法Test标记一个测试方法。在JUnit 5中它不再接受任何参数如JUnit 4的timeout。BeforeEach/AfterEach在每个Test方法之前/之后执行。常用于初始化测试数据和清理资源。这里有个坑如果BeforeEach中初始化了数据库数据AfterEach中必须清理否则数据残留会影响下一个测试违反Isolated原则。BeforeAll/AfterAll在所有测试方法之前/之后执行一次。方法必须是static的。适合初始化昂贵且共享的资源如数据库连接池但需谨慎确保测试间不会相互干扰。DisplayName为测试类或方法设置一个更易读的名称支持空格和特殊字符会在测试报告中显示。Disabled临时禁用某个测试并可以注明原因。参数化测试ParameterizedTest这是JUnit 5的一大亮点允许你用不同的参数多次运行同一个测试方法极大减少了重复代码。ParameterizedTest ValueSource(strings {racecar, radar, able was I ere I saw elba}) void testPalindromes(String candidate) { assertTrue(StringUtils.isPalindrome(candidate)); }除了ValueSource还有更强大的CsvSource直接内联CSV数据、MethodSource指定一个返回Stream的方法作为参数源等。在测试边界条件和多种输入组合时非常有用。动态测试TestFactory与静态的Test不同TestFactory方法在运行时动态生成一组测试用例。这在需要根据外部数据如文件列表、数据库查询结果生成测试时特别有用。TestFactory StreamDynamicTest dynamicTestsFromStream() { return Stream.of(A, B, C) .map(str - DynamicTest.dynamicTest(Test for str, () - assertTrue(str.length() 1))); }3.2 断言库AssertJ vs HamcrestJUnit自带的Assertions类功能基本但可读性一般。更推荐使用第三方断言库。AssertJ以其流式API和极高的可读性著称import static org.assertj.core.api.Assertions.*; assertThat(user.getName()) .isNotBlank() .startsWith(张) .hasSizeBetween(2, 10);它提供了对集合、字符串、日期、异常等几乎一切对象的丰富断言错误信息也极其友好。我个人强烈推荐AssertJ作为首选它的链式调用让测试代码读起来像自然语言。Hamcrest采用“匹配器Matcher”模式历史悠久与Mockito集成较好import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; assertThat(user.getAge(), greaterThan(18)); assertThat(userList, hasItem(hasProperty(name, equalTo(Alice))));它的表达方式更函数式但流畅度稍逊于AssertJ。选择建议新项目直接上AssertJ。如果是老项目且已大量使用Hamcrest可以继续沿用两者混用也无妨。3.3 Mock框架Mockito的核心技巧Mockito是模拟依赖对象的行业标准。它的核心是创建一个“替身”对象并规定这个替身在接收到特定调用时应返回什么值或抛出什么异常。基本Mock与Stub// 创建Mock对象 UserRepository mockRepo Mockito.mock(UserRepository.class); // 打桩Stubbing当调用findById(1L)时返回一个预设的User对象 User mockUser new User(1L, 张三); Mockito.when(mockRepo.findById(1L)).thenReturn(Optional.of(mockUser)); // 验证交互Verification验证某个方法是否被调用过以及调用的次数和参数 Mockito.verify(mockRepo, Mockito.times(1)).findById(Mockito.anyLong());重要进阶特性Mock与InjectMocks注解在测试类上使用ExtendWith(MockitoExtension.class)后可以用Mock注解自动创建Mock对象用InjectMocks注解创建被测对象并自动注入Mock依赖。这能让测试类更简洁。参数匹配器Argument MatchersMockito.any(),Mockito.eq(),Mockito.startsWith()等。用于更灵活地匹配方法参数。注意一旦在某个调用中使用了参数匹配器那么该次调用的所有参数都必须使用匹配器不能混用具体值和匹配器any()之类的除外。验证调用顺序Mockito.inOrder(mock1, mock2)可以验证多个Mock对象的调用是否按特定顺序发生。回答Answer当需要根据调用参数动态生成返回值时使用thenAnswer。监视真实对象Spy使用Mockito.spy()可以包装一个真实对象只模拟它的部分方法其余方法仍调用真实逻辑。慎用Spy它通常意味着你的类职责过多违反了单一职责原则。注意Mockito不能Mock静态方法、私有方法和构造方法除非使用mockito-inline扩展。过度Mock也是坏味道如果一个测试需要Mock大量依赖说明被测类可能耦合过高。4. 分层测试实战从单元到集成理论说再多不如一行代码。我们以一个简单的“用户服务UserService”为例它依赖“用户仓库UserRepository”和“消息服务NotificationService”。4.1 单元测试实战隔离与专注假设UserService有一个registerUser方法逻辑是检查用户名是否已存在若不存在则保存用户并发送欢迎消息。被测类Service public class UserService { private final UserRepository userRepository; private final NotificationService notificationService; public UserService(UserRepository ur, NotificationService ns) { this.userRepository ur; this.notificationService ns; } public User registerUser(String username, String email) { if (userRepository.findByUsername(username).isPresent()) { throw new IllegalArgumentException(Username already exists: username); } User newUser new User(username, email); userRepository.save(newUser); notificationService.sendWelcomeEmail(email); return newUser; } }单元测试类import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Optional; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; ExtendWith(MockitoExtension.class) // 启用Mockito注解支持 class UserServiceUnitTest { Mock private UserRepository userRepositoryMock; Mock private NotificationService notificationServiceMock; InjectMocks private UserService userService; // 自动将上面的Mock注入到UserService Test void registerUser_WithNewUsername_ShouldSaveAndNotify() { // 1. 准备阶段 (Given/Arrange) String username newUser; String email testexample.com; User savedUser new User(username, email); // 规定Mock对象的行为当查询此用户名时返回空表示不存在 when(userRepositoryMock.findByUsername(username)).thenReturn(Optional.empty()); // 规定保存用户时返回我们预设的这个用户对象模拟JPA的save行为 when(userRepositoryMock.save(any(User.class))).thenReturn(savedUser); // 2. 执行阶段 (When/Act) User result userService.registerUser(username, email); // 3. 断言阶段 (Then/Assert) // 验证返回的用户正确 assertThat(result).isNotNull(); assertThat(result.getUsername()).isEqualTo(username); assertThat(result.getEmail()).isEqualTo(email); // 验证与Mock对象的交互findByUsername被调用了一次且参数是username verify(userRepositoryMock, times(1)).findByUsername(username); // 验证save被调用了一次且参数是任意User对象 verify(userRepositoryMock, times(1)).save(any(User.class)); // 验证发送欢迎邮件的服务被调用了一次且参数是email verify(notificationServiceMock, times(1)).sendWelcomeEmail(email); } Test void registerUser_WithExistingUsername_ShouldThrowException() { // Given String existingUsername oldUser; User existingUser new User(existingUsername, oldexample.com); when(userRepositoryMock.findByUsername(existingUsername)) .thenReturn(Optional.of(existingUser)); // 模拟用户名已存在 // When Then // 使用AssertJ的异常断言验证执行特定代码会抛出特定异常 assertThatThrownBy(() - userService.registerUser(existingUsername, newexample.com)) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining(Username already exists); // 验证当抛出异常后save和sendWelcomeEmail方法不应该被调用 verify(userRepositoryMock, never()).save(any()); verify(notificationServiceMock, never()).sendWelcomeEmail(anyString()); } }实操心得测试方法命名我习惯用[方法名]_[测试场景]_[预期结果]的格式如registerUser_WithNewUsername_ShouldSaveAndNotify一目了然。Given-When-Then模式严格遵循这个结构组织测试代码逻辑非常清晰。验证交互单元测试不仅要验证结果状态还要验证对象间的协作行为。verify在这里至关重要它确保了UserService正确地调用了其依赖。4.2 集成测试实战与真实组件协作单元测试保证了单个类的逻辑正确但类与类、模块与模块之间的集成是否正确呢比如你的UserRepository是否真的能正确连接数据库并执行SQL这就需要集成测试。Spring Boot集成测试Spring Boot提供了强大的测试支持SpringBootTest注解会启动一个几乎完整的应用上下文但可以通过配置控制加载的范围。import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.jdbc.Sql; import javax.persistence.EntityManager; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; DataJpaTest // 专注于JPA组件的测试只加载Entity、Repository等不加载Service、Controller。它会自动配置一个内存数据库如H2。 class UserRepositoryIntegrationTest { Autowired private UserRepository userRepository; Autowired private EntityManager entityManager; // 可用于手动操作如清理数据 Test void shouldSaveAndRetrieveUser() { // Given User user new User(integrationUser, integrationtest.com); // When User savedUser userRepository.save(user); // 为了让save操作立即刷新到数据库在事务中可能不会立即提交可以显式flush entityManager.flush(); entityManager.clear(); // 清除持久化上下文强制从数据库重新加载 // Then User foundUser userRepository.findById(savedUser.getId()).orElse(null); assertThat(foundUser).isNotNull(); assertThat(foundUser.getUsername()).isEqualTo(integrationUser); } Test Sql(/test-data.sql) // 执行测试前运行指定的SQL脚本初始化数据 void shouldFindUsersByEmailContaining() { ListUser users userRepository.findByEmailContaining(test.com); assertThat(users).hasSize(2); // 假设test-data.sql插入了两条相关数据 } }关键点DataJpaTest是SpringBootTest的“切片测试”Slice Test版本它只加载数据层相关的Bean启动速度远快于全应用启动。它默认会使用一个内存数据库如H2并自动配置事务每个测试方法结束后会自动回滚保证测试隔离。这就是为什么我们通常不需要在AfterEach中清理数据。Sql注解用于在测试前或测试后执行SQL脚本是准备复杂测试数据的利器。Web层集成测试WebMvcTest测试Controller层不启动完整的服务器而是模拟Servlet环境。import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import com.fasterxml.jackson.databind.ObjectMapper; import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; WebMvcTest(UserController.class) // 只加载Web层相关的Bean主要是Controller class UserControllerIntegrationTest { Autowired private MockMvc mockMvc; // 模拟HTTP请求的核心类 Autowired private ObjectMapper objectMapper; // 用于JSON序列化/反序列化 MockBean // 在应用上下文中用Mock对象替换真实的Service Bean private UserService userService; Test void createUser_ShouldReturnCreatedUser() throws Exception { UserDto request new UserDto(webUser, webtest.com); User responseUser new User(webUser, webtest.com); responseUser.setId(1L); given(userService.registerUser(request.getUsername(), request.getEmail())) .willReturn(responseUser); mockMvc.perform(post(/api/users) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))) .andExpect(status().isCreated()) .andExpect(jsonPath($.id).value(1L)) .andExpect(jsonPath($.username).value(webUser)); } }这里我们MockBean了UserService因为我们要测试的是Controller的HTTP映射、参数绑定和响应处理逻辑而不是Service的业务逻辑那已经在单元测试中覆盖了。MockMvc让我们能精细地模拟请求和验证响应。5. 测试数据管理与测试替身策略如何管理测试数据以及如何处理那些难以直接测试的依赖如第三方API、文件系统是测试中的常见挑战。5.1 测试数据构建ObjectMother与TestDataBuilder硬编码的构造对象在多个测试中重复会带来维护灾难。推荐两种模式ObjectMother一个提供创建标准测试对象方法的工厂类。public class UserMother { public static User createValidUser() { return new User(defaultUser, defaultemail.com); } public static User createUserWithUsername(String username) { return new User(username, username email.com); } } // 在测试中使用User user UserMother.createValidUser();Builder模式推荐更灵活特别是配合Lombok的Builder。Test void testWithBuilder() { User user User.builder() .username(customUser) .email(customtest.com) .age(25) // 只设置关心的属性 .build(); // ... 测试逻辑 }Builder模式可以让你在测试中只设置与当前测试场景相关的属性让测试意图更清晰。5.2 处理外部依赖Mock、Stub与Test Double对于外部依赖我们根据测试目的选择不同的“测试替身”Mock如Mockito创建的对象。主要用于行为验证验证是否以特定方式被调用。Stub为特定调用提供预设的响应。Mockito的when().thenReturn()就是在创建Stub。主要用于状态验证提供输入验证被测对象的状态输出。Fake一个轻量级的、可工作的实现用于替代真实实现。例如用一个基于内存的UserRepository实现来替代真实的数据库Repository用于集成测试。注意Fake本身也需要被测试。Spy部分真实、部分Mock的对象。应谨慎使用。对于第三方HTTP API可以使用WireMock来模拟一个真实的HTTP服务。你可以定义当收到特定请求时返回什么响应从而在测试中完全控制这个外部依赖。对于数据库在单元测试中Mock Repository在集成测试中使用真实的Repository和内存数据库如H2。关键技巧使用Transactional和Rollback默认确保每个测试方法在独立的事务中运行测试后数据自动回滚保持环境干净。6. 测试代码的常见坏味道与优化实践写测试代码和写生产代码一样需要关注可读性、可维护性和设计质量。6.1 测试代码的坏味道脆弱测试测试过于依赖实现细节如私有方法、特定的执行顺序实现稍一改动测试就大量失败。对策测试公共行为而非私有实现。缓慢测试测试套件运行时间过长阻碍持续集成。对策区分快慢测试使用Tag(slow)标记慢测试在CI中只运行快测试定期运行全量测试。重复测试多个测试中有大量重复的配置代码。对策提取到BeforeEach方法或使用自定义的Test Fixture类。但要注意过度提取可能会降低测试的可读性。条件逻辑测试代码中出现if-else或循环。对策使用参数化测试ParameterizedTest来覆盖不同条件。过度验证验证了太多不重要的交互或者验证了Mock对象的内部状态。对策只验证与测试目标直接相关的、重要的交互。6.2 提升测试可维护性的技巧单一断言原则一个测试方法最好只验证一件事。但这不意味着只能有一行assert语句而是所有断言都应该服务于同一个逻辑目标。如果验证多个不相关的事情当测试失败时定位问题会更困难。使用自定义断言对于复杂的对象验证可以封装自定义的AssertJ断言提高可读性和复用性。public class UserAssert extends AbstractAssertUserAssert, User { public UserAssert hasValidEmail() { // 自定义验证逻辑 if (!actual.getEmail().contains()) { failWithMessage(Expected user to have a valid email, but was %s, actual.getEmail()); } return this; } } // 使用assertThat(user).hasValidEmail();测试私有方法通常不建议直接测试私有方法。私有方法是实现细节应该通过测试公有方法来间接覆盖。如果觉得私有方法逻辑复杂到必须单独测试那往往是一个信号这个私有方法应该被提取到一个独立的、可公开测试的类中。7. 持续集成中的测试策略与实战问题排查测试的价值在持续集成CI流水线中才能最大化体现。一个典型的CI流水线步骤可能是代码推送 - 编译 - 运行单元测试 - 运行集成测试 - 打包 - 部署到测试环境 - 运行端到端测试。7.1 配置Maven/Gradle运行测试在Maven中mvn test默认运行所有以Test开头或结尾的类中的测试遵循Surefire插件约定。mvn verify会额外运行以IT结尾的集成测试遵循Failsafe插件约定。你可以通过Category或JUnit 5的Tag来对测试进行分类然后在pom.xml中配置分别运行。!-- Maven Surefire 插件配置 (运行单元测试) -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId configuration groupsfast | unit/groups !-- 只运行标记为fast或unit的测试 -- /configuration /plugin !-- Maven Failsafe 插件配置 (运行集成测试) -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-failsafe-plugin/artifactId configuration groupsintegration/groups /configuration /plugin7.2 常见问题排查实录在实际操作中你一定会遇到各种测试失败。这里记录几个我踩过的坑和解决方法java.lang.OutOfMemoryError: insufficient memory场景在CI服务器或本地运行大量测试时发生。排查单元测试通常很快如果发生OOM很可能是集成测试或某些测试没有正确清理资源如数据库连接、文件句柄、HTTP连接池。解决检查是否在AfterEach或AfterAll中正确关闭了所有资源。为Maven Surefire/Failsafe插件增加JVM参数argLine-Xmx1024m -XX:MaxMetaspaceSize256m/argLine。使用DirtiesContext注解要谨慎它会导致Spring应用上下文被销毁重建消耗大量内存。尽量通过Transactional和事务回滚来保持测试隔离。测试通过但实际功能有问题假阳性场景Mock行为定义过于宽松导致测试没有验证到真实逻辑。案例使用Mockito.any()匹配所有参数但实际代码中对参数有特定校验。解决尽量使用精确的参数匹配eq()或者至少验证参数的关键属性。避免过度使用any()。Lombok与测试框架的冲突场景使用Lombok的Builder等注解后测试中调用构建器方法编译报错提示“cannot find symbol”。排查IDE没有正确配置Lombok注解处理器或者构建工具Maven/Gradle的编译顺序问题。解决确保IDE安装了Lombok插件并启用了注解处理。在Maven中确保lombok依赖在dependencies中并且maven-compiler-plugin版本支持注解处理3.5通常没问题。有时需要执行mvn clean compile一次让Lombok先生成代码。数据库集成测试数据污染场景测试A创建的数据影响了测试B的结果。排查没有使用事务回滚或者使用了DataJpaTest但手动插入了数据且没有清理。解决首选依赖Spring测试框架的默认行为——每个测试方法在一个事务中方法结束后自动回滚。确保你的测试配置正确如DataJpaTest默认启用此行为。次选在BeforeEach中清理数据库如使用JdbcTemplate执行DELETE在AfterEach中也清理一次作为双保险。但这种方法较慢。为每个测试生成唯一的数据如使用随机UUID作为用户名避免冲突。测试随机失败Flaky Tests场景测试有时成功有时失败没有修改任何代码。常见原因异步操作没有等待异步任务完成就进行断言。使用Awaitility等库进行异步等待。时间依赖测试中使用了new Date()或System.currentTimeMillis()断言依赖于特定时间。使用Clock类并注入一个固定的时钟进行测试。测试顺序依赖测试之间通过静态变量或共享状态产生了隐式依赖。严格遵守FIRST原则的Isolated使用BeforeEach重置状态。外部服务不稳定依赖的测试环境数据库或服务偶尔超时。考虑使用更稳定的测试环境或者为这类集成测试设置更长的超时时间和重试机制。写出稳定、快速、可维护的测试代码是一个需要持续练习和反思的技能。它没有终点但每一点投入都会在代码质量、开发效率和团队信心上带来丰厚的回报。从今天起尝试为你写的下一个方法配上测试你会发现你对代码的理解会深入一个层次。

相关新闻

AGPL - 3.0许可的CAGIRE v0.1.9发布,支持Forth实时编码,跨平台免费开源!

AGPL - 3.0许可的CAGIRE v0.1.9发布,支持Forth实时编码,跨平台免费开源!

下载途径 Cagire提供了丰富的下载选项,涵盖多个平台和不同版本。具体如下: 平台终端版桌面版macOS(通用版)zipzip dmg appLinux(x86_64)zip AppImagezip AppImageLinux(ARM)zip …

2026/10/19 6:01:05 阅读更多 →
告别挂号难:91160-cli医院全自动挂号神器使用指南

告别挂号难:91160-cli医院全自动挂号神器使用指南

告别挂号难:91160-cli医院全自动挂号神器使用指南 【免费下载链接】91160-cli 健康160全自动挂号脚本,捡漏神器 项目地址: https://gitcode.com/gh_mirrors/91/91160-cli 还在为医院挂号烦恼吗?91160-cli是一款专为解决医院挂号难题而…

2026/10/18 19:18:11 阅读更多 →
Inkling AI编程助手:基于ARC推理能力的代码生成与开发实践

Inkling AI编程助手:基于ARC推理能力的代码生成与开发实践

最近在AI圈里有个低调但值得关注的消息:Inkling项目悄然发布,同时在ARC评测中表现突出。如果你正在关注AI智能体开发或者对下一代编程助手感兴趣,这篇文章将为你详细解析Inkling到底是什么、为什么值得关注,以及如何在你的开发环境…

2026/10/18 17:12:48 阅读更多 →

最新新闻

Docker容器隔离与网络通信原理:从namespace到iptables一网打尽

Docker容器隔离与网络通信原理:从namespace到iptables一网打尽

先说个现象:很多人本机用Docker跑一两个容器,感觉一切都很美好;可一旦项目多起来,要同时起十几个服务,最让人头疼的一定是网络。容器之间互相不通、端口映射诡异失效、跨主机通信直接懵圈,这些问题几乎每个…

2026/10/19 6:00:36 阅读更多 →
从零搭建 artcraft 创意工具:本地优先架构与静态导出实践

从零搭建 artcraft 创意工具:本地优先架构与静态导出实践

1. 从零搭建一个叫 artcraft 的创意工具:我踩过的坑和最终跑通的方案第一次看到 artcraft 这个词,脑子里蹦出来的是“艺术”加“手艺”的组合,直觉告诉我这应该是一个跟创意生产、手工制作或者视觉表达沾边的项目。后来陆续在一些独立开发者的…

2026/10/19 6:00:36 阅读更多 →
diagram-design:从草图到系统,掌握技术图表设计核心方法

diagram-design:从草图到系统,掌握技术图表设计核心方法

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次看到 “diagram-design” 这个标题,很多人会以为它只是教你怎么画流程图、时序图或者架构图。但真正做过技术方案、写过设计文档、给团队做过评审的人都知道,画图这件事从来…

2026/10/19 6:00:36 阅读更多 →
IAR Embedded Workbench for AVR:IDE工具链、C-SPY调试与工程实战指南

IAR Embedded Workbench for AVR:IDE工具链、C-SPY调试与工程实战指南

简介:嵌入式开发中,IDE和调试器的选择直接影响固件开发效率。IAR Embedded Workbench作为支持AVR微控制器的集成开发环境,将编译器、汇编器、连接器与C-SPY调试器统一在同一个工程管理框架内,为8位、16位和32位不同架构芯片提供一…

2026/10/19 6:00:36 阅读更多 →
数学建模国赛A题回焊炉炉温曲线:从牛顿冷却定律到粒子群优化实战

数学建模国赛A题回焊炉炉温曲线:从牛顿冷却定律到粒子群优化实战

简介:面向数学建模竞赛参赛者和指导教师,这份资源为2020年国赛A题论文成品,聚焦集成电路回焊炉温度曲线优化,完整呈现从问题重述、模型假设到求解与检验的全过程。论文以牛顿冷却定律为核心建立温度控制模型,通过最小二…

2026/10/19 6:00:36 阅读更多 →
AI春节档深度观察:拜年玩法、创作工具与行业真相

AI春节档深度观察:拜年玩法、创作工具与行业真相

1. 春节档的主角,从电影院跑到了AI里我这两年有个很直观的感受:一进腊月,朋友圈里的AI产品广告比年货广告还密集。今天这家上线"拜年大模型",明天那家推出"国风写真生成器",后天又有人发布"数…

2026/10/19 5:59:36 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →