單元測試之JUnit5知識點總結及代碼示例

? ? ?單元測試是軟件開發過程中的一種驗證手段,它針對最小的可測試部分(通常是函數或方法)進行檢查和驗證。其實單元測試還是挺重要的,不過國內很多公司的項目其實并沒有做好單元測試,或者根本就沒做單元測試,原因可能是項目周期比較緊張,開發時間不充足,所以就省略了單元測試,也有可能是領導不重視單元測試。之前工作中做單元測試主要用到JUnit和TestNG,做覆蓋統計主要用的JaCoCo。不過本篇主要總結JUnit5的知識點及用法。JUnit5官網:JUnit 5

目錄

1.Junit5簡介和環境搭建

2.JUnit 5 的主要注解

?3.JUnit 5 斷言(Assertions)

?4.JUnit 5 測試方法

5.?JUnit 5 測試執行控制

6.JUnit 5 測試輸出

?7.JUnit 5 測試輔助功能

8.JUnit 5 錯誤處理和異常測試

9.JUnit 5 測試依賴注入

10.JUnit 5 測試監聽器

11.JUnit 5 測試配置

12.?JUnit 5 測試動態生成

13.JUnit 5 測試參數化

14.JUnit 5 測試并行執行

15.JUnit 5 測試可讀性

16.JUnit 5 測試條件

17.Spring Boot項目集成Junit5


? ? ?1.Junit5簡介和環境搭建
特性描述
JUnit 5 架構JUnit 5 由三個主要模塊組成:JUnit Platform、JUnit Jupiter 和 JUnit Vintage。
JUnit Platform提供了一個測試框架的運行時平臺,允許IDE和構建工具在JVM上啟動和請求測試。
JUnit Jupiter提供了新的編程模型和擴展模型,用于編寫測試。
JUnit Vintage允許JUnit 5運行JUnit 3和JUnit 4的測試。
環境搭建使用Maven或Gradle將JUnit 5添加到項目中。

環境搭建:

?使用Maven或Gradle將JUnit 5添加到項目中。

<dependency> 
<groupId>org.junit.jupiter</groupId> 
<artifactId>junit-jupiter-api</artifactId><version>5.7.0</version><scope>test</scope></dependency>?
2.JUnit 5 的主要注解
注解描述代碼示例
@BeforeEach在每個測試方法執行之前運行的方法。
@BeforeEach 
public void init() { 
... }

@AfterEach在每個測試方法執行之后運行的方法。@AfterEach public void tearDown() { ... }
@BeforeAll在所有測試方法執行之前,整個類中只運行一次。?@BeforeAll public static void setUpBeforeClass() { ... }
@AfterAll在所有測試方法執行之后,整個類中只運行一次。?@AfterAll public static void tearDownAfterClass() { ... }
@Test標記一個方法為測試方法。?@Test public void myTestMethod() { ... }
@RepeatedTest允許測試方法重復執行指定次數。?@RepeatedTest(10) public void repeatedTestMethod() { ... }
@ParameterizedTest用于參數化測試。?@ParameterizedTest public void parameterizedTestMethod(int param) { ... }
@MethodSource@ParameterizedTest一起使用,提供測試參數。
?@MethodSource("parameters") 
public void parameterizedTestMethod(int param) { 
... 
} static Stream<Object[]> parameters() { 
return Stream.of(new Object[]{1}); }

?3.JUnit 5 斷言(Assertions)
斷言方法描述代碼示例
assertAll()允許組合多個斷言,如果任何一個斷言失敗,測試會立即失敗。?assertAll("Test Group", () -> assertEquals(2, 1 + 1), () -> assertEquals("foo", "bar"));
assertNotNull()驗證對象不是null?assertNotNull("Object should not be null", myObject);
assertNull()驗證對象是null?assertNull("Object should be null", myObject);
assertTrue()驗證條件為true?assertTrue("Should be true", condition);
assertFalse()驗證條件為false?assertFalse("Should be false", condition);
assertEquals()驗證兩個值是否相等。?assertEquals(2, 1 + 1);
assertNotEquals()驗證兩個值是否不相等。?assertNotEquals("Should not be equal", 2, 3);
assertSame()驗證兩個引用是否指向同一個對象。?Object obj1 = new Object(); Object obj2 = obj1; assertSame(obj1, obj2);
assertNotSame()驗證兩個引用是否指向不同的對象。?assertNotSame("Should not be same", obj1, obj2);

以上是JUnit 5中常用的斷言方法,它們幫助開發者驗證測試用例中的預期結果是否符合實際結果。

?4.JUnit 5 測試方法
特性描述代碼示例
測試方法使用@Test注解標記的方法,JUnit 5將自動運行這些方法作為測試。?@Test public void testMethod() { ... }
測試方法參數測試方法可以接收參數,如測試數據。?@ParameterizedTest public void testMethod(String data) { ... }
超時測試使用@Timeout注解設置測試方法的最大執行時間。?@Test @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) public void testMethod() { ... }
動態測試使用@DynamicTest注解創建動態生成的測試。?
@TestFactoryStream<DynamicTest> dynamicTestsStream() { 
return Stream.of("Test1", "Test2") .map(data -> DynamicTest.dynamicTest(data, () -> {... 
}
)); 
}

條件測試使用@EnabledIf@DisabledIf注解根據條件啟用或禁用測試。?@EnabledIf("expression") @Test public void testMethod() { ... }
5.?JUnit 5 測試執行控制
控制方式描述代碼示例
標簽(Tags)使用@Tag注解給測試分類,可以通過標簽過濾運行特定測試。?@Tag("fast") @Test public void fastTestMethod() { ... }
測試配置(Test Configuration)使用@TestInstance注解控制測試方法的生命周期。?@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class MyTestClass { ... }
測試篩選器(Test Filters)使用JUnit 5的內置篩選器來選擇要運行的測試。在命令行中使用?-@include?或?--exclude?選項。
測試依賴(Test Dependencies)使用@ExtendWith注解定義測試類或方法的依賴關系。?@ExtendWith(CustomExtension.class) public class MyTestClass { ... }
重復測試(Repeated Tests)使用@RepeatedTest注解讓測試方法重復執行。?@RepeatedTest(5) public void repeatedTestMethod() { ... }
參數化測試(Parameterized Tests)使用@ParameterizedTest@MethodSource注解執行參數化測試。?@ParameterizedTest @MethodSource("dataProvider") public void parameterizedTest(int param) { ... } static Stream<?> dataProvider() { return Stream.of(1, 2, 3); }
臨時文件夾(Temporary Folders)使用@TempDir注解為測試方法提供臨時文件夾路徑。?@Test public void testWithTempFolder(@TempDir Path tempDir) { ... }

以上是JUnit 5中測試執行控制的一些關鍵特性,它們允許開發者更靈活地控制測試的執行流程和條件。

6.JUnit 5 測試輸出
特性描述代碼示例
斷言消息使用斷言方法的重載版本,提供自定義的失敗消息。?assertEquals("List should contain 'B'", "A", list.get(1));
日志記錄使用@LogMessageRule注解捕獲日志消息。?@Rule public LogMessageRule rule = new LogMessageRule(); @Test public void testLogCapture() { rule.expect(WARNING); logger.warn("This is a warning message"); }
測試輸出(Test Output)使用@TestInfo獲取測試信息,如測試方法名稱、顯示名稱等。?@Test public void testWithTestInfo(TestInfo testInfo) { System.out.println("Running test: " + testInfo.getDisplayName()); }
測試模板方法(Test Template Methods)使用@TestTemplate注解定義模板方法,結合@ExtendWith注解使用。?@TestTemplate public void testTemplateMethod(MyCustomExtension ext) { ... } @ExtendWith(MyCustomExtension.class) public void extendWithMethod() { ... }
動態測試(Dynamic Tests)生成動態測試用例,返回StreamDynamicTest?@TestFactory Stream<DynamicTest> dynamicTests() { return Stream.of("A", "B", "C") .map(input -> DynamicTest.dynamicTest(input, () -> assertEquals(1, input.length()))); }
?7.JUnit 5 測試輔助功能
功能描述代碼示例
假設(Assumptions)使用假設來避免在不滿足特定條件時執行測試。assumeTrue("This test assumes JDK 11 or higher", javaVersion >= 11);
測試時鐘(Test Clock)使用@MockClock注解模擬時間,用于時間相關的測試。?@Test @MockClock("12:00:00") public void testWithMockClock() { ... }
測試資源(Test Resources)使用@RegisterExtension注解注冊測試資源,如臨時文件、數據庫連接等。?@RegisterExtension public TemporaryFolder folder = new TemporaryFolder(); @Test public void testWithTemporaryFolder() { Path path = folder.getRoot().toPath(); ... }
測試規則(Test Rules)使用測試規則來為測試方法提供額外的行為,如日志捕獲、重復測試等。?@Rule public TestRule logWatcher = new LogWatcher(); @Test public void testWithLogWatcher() { ... }
條件測試(Conditional Tests)根據系統屬性或環境變量的條件執行測試。?@EnabledIfEnvironment("os.name == 'Windows 10'") @Test public void windows10OnlyTest() { ... }
測試配置參數(Test Configuration Parameters)從命令行或配置文件中讀取參數,并在測試中使用。?@Test public void testWithConfigurationParameter(@ConfiguredParameter("timeout") int timeout) { ... }
測試模板方法(Test Template Methods)允許為測試提供自定義的執行邏輯。?@TestTemplate public void testTemplateMethod(MyCustomExtension ext) { ... } @ExtendWith(MyCustomExtension.class) public void extendWithMethod() { ... }

這些輔助功能增強了JUnit 5的測試能力,使得測試更加靈活和強大

8.JUnit 5 錯誤處理和異常測試
特性描述代碼示例
期望異常(Expected Exceptions)使用assertThrows來驗證方法是否拋出了特定的異常。?Assertions.assertThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException("bad argument"); });
異常測試(Exception Testing)使用@Test注解的expectedExceptions屬性來測試預期的異常。?@Test(expectedExceptions = ArithmeticException.class) public void testDivideByZero() { int i = 1 / 0; }
斷言異常內容(Asserting Exception Content)捕獲異常并驗證其內容,如消息或原因。?Exception exception = assertThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException("error"); }); assertEquals("error", exception.getMessage());
錯誤收集(Error Collecting)使用assertAll來執行多個斷言,即使其中一個失敗,其他斷言也會繼續執行。?assertAll("test", () -> assertEquals(2, 1 + 1), () -> assertThrows(RuntimeException.class, () -> { throw new RuntimeException(); }));
軟斷言(Soft Assertions)使用軟斷言來收集多個失敗的斷言,而不是在第一個失敗時立即停止測試。?SoftAssertions softly = new SoftAssertions(); softly.assertThat(codePointBefore('a')).isEqualTo(-1); softly.assertThat(codePointBefore('A')).isEqualTo(-1); softly.assertAll();

?這些特性幫助開發者更好地處理測試中的異常情況,確保測試的準確性和健壯性。

9.JUnit 5 測試依賴注入
特性描述代碼示例
構造器注入使用@Autowired注解在測試類構造器中注入依賴。?@SpringBootTest public class MySpringBootTest { @Autowired private MyService service; }
字段注入使用@Inject注解在字段上注入依賴。?public class MyTestClass { @Inject private MyService service; }
方法參數注入使用@InjectMocks注解在測試方法的參數上注入依賴。@Test public void testMethod(@Mocked MyDependency dependency) { ... }
模塊化測試使用@ExtendWith注解和自定義擴展來模塊化測試邏輯。?@ExtendWith(MyExtension.class) public class MyTestClass { ... }
測試實例化使用@TestInstance注解控制測試類的實例化方式。?@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class MyTestClass { ... }
測試上下文管理使用@TestInfo獲取測試上下文信息,如測試方法名稱、測試類等。public class MyTestClass { @Test public void testMethod(TestInfo testInfo) { System.out.println(testInfo.getDisplayName()); } }

依賴注入是現代測試框架中的重要特性,它允許測試代碼更加模塊化和可重用。JUnit 5通過集成Spring等框架,提供了強大的依賴注入支持。

10.JUnit 5 測試監聽器
特性描述代碼示例
監聽器(Listeners)使用@ExtendWith注解添加監聽器,監聽測試的生命周期事件。?@ExtendWith(MyTestWatcher.class) public class MyTestClass { ... }
測試執行監聽器(Test Execution Listeners)實現TestExecutionListener接口,監聽測試的執行過程。?public class MyTestExecutionListener implements TestExecutionListener { ... }
測試實例監聽器(Test Instance Listeners)實現TestInstanceListener接口,監聽測試實例的創建和生命周期。public class MyTestInstanceListener implements TestInstanceListener { ... }
測試生命周期監聽器(Test Lifecycle Listeners)實現TestLifecycleListener接口,監聽測試的整個生命周期。?public class MyTestLifecycleListener implements TestLifecycleListener { ... }
測試失敗監聽器(Test Failure Listeners)實現TestFailureListener接口,監聽測試失敗事件。?public class MyTestFailureListener implements TestFailureListener { ... }
測試告警監聽器(Test Alerting Listeners)實現TestAlerting接口,對測試失敗進行告警。?public class MyTestAlerting implements TestAlerting { ... }

測試監聽器是JUnit 5中用于監聽和響應測試事件的強大機制,它們可以用來擴展JUnit 5的功能,如測試報告生成、性能監控等。

11.JUnit 5 測試配置
配置項描述使用示例
全局配置通過junit-platform.properties文件進行全局配置。junit.jupiter.conditions.include-classes-with-at-least-one-method = true
測試方法配置使用注解在測試方法上指定配置。?@Test @DisplayName("A test with custom display name") void testMethod() { ... }
測試類配置使用注解在測試類上指定配置。?@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class MyTestClass { ... }
測試模板配置使用注解在測試模板方法上指定配置。?@TestTemplate public void testTemplate() { ... }
參數化測試配置使用注解在參數化測試方法上指定配置。?@ParameterizedTest(name = "{index} => {0} + {1} = {2}") @MethodSource("dataProvider") void parameterizedTest(int a, int b, int expected) { ... }
測試過濾器配置使用注解或命令行參數來過濾測試。在命令行中使用?--filter?選項。
測試重復配置使用注解在測試方法上指定重復次數。?@RepeatedTest(3) void repeatedTestMethod() { ... }
測試超時配置使用注解在測試方法上指定執行超時時間。@Test @Timeout(duration = 500, unit = TimeUnit.MILLISECONDS) void testMethod() { ... }

測試配置是JUnit 5中用于定制測試行為的重要特性,它允許開發者根據需要調整測試的執行方式。

12.?JUnit 5 測試動態生成
特性描述代碼示例
動態測試(Dynamic Tests)允許在測試執行期間動態生成測試用例。@TestFactory Stream<DynamicTest> dynamicTests() { return Stream.of("foo", "bar") .map(s -> DynamicTest.dynamicTest(s, () -> assertNotEquals(0, s.length()))); }
測試工廠(Test Factories)創建動態測試的方法,可以返回StreamIterableDynamicTest?@TestFactory Stream<DynamicTest> dynamicTestsWithStream() { return Stream.of(1, 2, 3) .map(i -> DynamicTest.dynamicTest("Test with " + i, () -> {})); }
測試模板方法(Test Template Methods)使用模板方法來定義測試邏輯,并通過擴展執行不同的測試用例。?@TestTemplate void testWithCustomProvider(Object o) { ... } @ExtendWith(CustomProviderExtension.class) void extendWithCustomProvider() { ... }
測試擴展(Test Extensions)自定義擴展可以介入測試執行的各個階段,實現自定義邏輯。?public class CustomExtension implements TestExecutionListener { ... }

動態生成測試用例是JUnit 5中一個強大的特性,它允許開發者根據需要靈活地生成測試用例,從而提高測試的復用性和靈活性。

13.JUnit 5 測試參數化
特性描述代碼示例
參數化測試(Parameterized Tests)允許為單個測試方法提供多個輸入參數。?@ParameterizedTest @MethodSource("numbersProvider") void parameterizedTest(int number) { ... } static Stream<Integer> numbersProvider() { return Stream.of(1, 2, 3); }
方法源(Method Source)提供測試參數的來源,可以是靜態方法或字段。?static Stream<Arguments> numbersProvider() { return Stream.of(Arguments.of(1), Arguments.of(2), Arguments.of(3)); }
CSV源(CSV Source)使用CSV格式的字符串直接提供測試參數。?@ParameterizedTest @CsvSource({ "1, 2, 3", "4, 5, 6" }) void parameterizedTest(int a, int b, int c) { ... }
對象數組源(Object Array Source)使用對象數組直接提供測試參數。?@ParameterizedTest @ArgumentsSource(ObjectArraySource.class) void parameterizedTest(String data) { ... }
自定義提供器(Custom Providers)創建自定義的參數提供器來生成測試參數。?public class CustomProvider implements ArgumentsProvider { public Stream<? extends Arguments> provideArguments(ExtensionContext context) { return Stream.of(Arguments.of("A", "B")); } }

參數化測試是JUnit 5中用于測試多種輸入組合的強大特性,它允許開發者編寫更簡潔、更高效的測試代碼。

14.JUnit 5 測試并行執行
特性描述代碼示例
并行執行(Parallel Execution)允許同時運行多個測試,以加快測試套件的執行速度。使用JUnit 5的junit.jupiter.execution.parallel.enabled配置屬性來啟用并行執行。
測試類級別的并行對整個測試類中的測試方法進行并行執行。?@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class MyTestClass { ... }
方法級別的并行對單個測試方法進行并行執行。使用JUnit 5的junit.jupiter.execution.parallel.mode.default配置屬性來設置默認的并行模式。
自定義并行策略通過實現TestExecutionListener接口來自定義測試的并行執行策略。?public class CustomParallelismListener implements TestExecutionListener { ... }
資源隔離確保在并行執行過程中,測試之間的資源是隔離的,避免相互干擾。使用@RegisterExtension注解的ResourceLock規則來鎖定特定資源。
動態測試并行對動態生成的測試用例進行并行執行。@TestFactory方法中返回的DynamicTest流可以被并行執行。

測試并行執行是提高測試效率的重要特性,它可以有效減少持續集成(CI)環境中的測試等待時間。

15.JUnit 5 測試可讀性
特性描述代碼示例
顯示名稱(Display Name)為測試方法提供可讀性強的顯示名稱。?@DisplayName("Test with custom display name") @Test public void testMethod() { ... }
嵌套測試(Nested Tests)使用嵌套的測試方法來組織測試邏輯,提高測試的可讀性。?@Test public void outerTest() { @Test public void innerTest() { ... } }
測試描述(Test Description)提供測試的描述信息,增強測試的可讀性。使用TestInfo獲取測試的描述信息,并在測試日志中展示。
斷言消息(Assertion Messages)在斷言失敗時提供自定義的消息,幫助理解失敗的原因。?assertEquals("Expected reference equality", obj1, obj2);
測試模板(Test Templates)使用測試模板方法來提供可讀性強的測試邏輯。?@TestTemplate void testWithCustomProvider(Object o) { ... }

測試可讀性是JUnit 5中用于提高測試代碼和測試報告可讀性的重要特性,它有助于開發者更好地理解和維護測試代碼。

16.JUnit 5 測試條件
特性描述代碼示例
條件注解(Conditional Annotations)根據條件啟用或禁用測試,如系統屬性、環境變量等。?@EnabledIf("javaVersion > 11") @Test public void testMethod() { ... }
系統屬性條件(System Property Condition)根據系統屬性的值來啟用或禁用測試。?@EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*") @Test public void testMethod() { ... }
環境變量條件(Environment Variable Condition)根據環境變量的值來啟用或禁用測試。?@EnabledIfEnvironmentVariable(named = "CI", matches = "true") @Test public void testMethod() { ... }
自定義條件(Custom Conditions)實現Condition接口來提供自定義的條件邏輯。?public class CustomCondition implements Condition { ... }
測試配置參數(Test Configuration Parameters)從命令行或配置文件中讀取參數,并在測試中使用。?@Test public void testWithConfigurationParameter(@ConfiguredParameter("timeout") int timeout) { ... }

測試條件是JUnit 5中用于根據環境或配置來控制測試執行的重要特性,它允許開發者靈活地決定哪些測試應該運行。

17.Spring Boot項目集成Junit5

? 17.1首先,確保你的pom.xml(Maven)或build.gradle(Gradle)文件中包含了JUnit 5和Spring Boot Test的依賴。

對于Maven,pom.xml可能包含以下依賴:

<dependencies><!-- Spring Boot Test Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.5.0</version> <!-- 使用你項目匹配的版本 --><scope>test</scope></dependency>
</dependencies>

?對于Gradle,build.gradle可能包含以下依賴:

dependencies {// Spring Boot Test StartertestImplementation('org.springframework.boot:spring-boot-starter-test:2.5.0') // 使用你項目匹配的版本
}

17.2 創建測試類

創建一個測試類,使用@SpringBootTest注解來指示Spring Boot為測試提供支持。使用@Test注解標記測試方法。

這里是一個簡單的服務層測試示例:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
public class SomeServiceTest {@Autowiredprivate SomeService someService;@MockBeanprivate SomeDependency someDependency;@Testpublic void testSomeMethod() {// 設置mock行為when(someDependency.someMethod()).thenReturn("expected value");// 調用待測試的方法String result = someService.someMethod();// 驗證結果assertEquals("expected value", result);// 驗證依賴是否被調用verify(someDependency).someMethod();}
}

?這個例子中,SomeService是我們想要測試的服務層組件,而SomeDependency是它的一個依賴項,我們使用@MockBean注解來創建一個模擬對象。

17.3 運行測試

你可以在IDE中運行測試,或者使用Maven或Gradle的命令行工具來執行測試。

對于Maven,使用以下命令:

mvn test

?對于Gradle,使用以下命令:

./gradlew test

?這只是一個極簡單的示例,在項目的具體需求下,測試會更復雜,包括更多的模擬對象,服務和測試用例等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11172.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

英語復習之英語形近詞總結(四)

英語形近詞總結復習第四部分&#xff1a; 單詞 釋義例句 genuine 英 /?d?enju?n/ 美 /?d?enju?n/ adj.真實的&#xff0c;真正的&#xff1b;誠懇的 1.Only genuine refugees can apply for asylum. 只有真正的難民才能申請政治避難。 《牛津詞典》 2.This isnt a genui…

C++筆試強訓day19

目錄 1.小易的升級之路 2.禮物的最大價值 3.對稱之美 1.小易的升級之路 鏈接 模擬就行&#xff0c;唯一可能是難點得就是gcd&#xff08;最大公約數&#xff09; #include <iostream> using namespace std; #define int long long const int N 1e5 10; int arr[N];…

兒童懸吊訓練系統如何進行制動肌的動力訓練

兒童懸吊訓練系統進行制動肌的動力訓練&#xff0c;可以按照以下步驟進行&#xff1a; 評估&#xff1a;首先&#xff0c;治療師需要對兒童的制動肌進行評估&#xff0c;確定其穩定性和力量水平&#xff0c;從而制定合適的訓練計劃。 選擇訓練方式&#xff1a;根據評估結果&am…

利用IP地址查詢解決被“薅羊毛”的方法

在互聯網時代&#xff0c;隨著各種網絡詐騙手段的不斷更新和演變&#xff0c;“薅羊毛”成為了一種常見的網絡犯罪行為。其中&#xff0c;利用查詢IP地址進行欺詐活動已經成為一種普遍的手段。當個人或組織的IP地址被不法分子查詢后&#xff0c;可能會面臨虛假注冊、盜取個人信…

Python中的絕對路徑與相對路徑詳解

對路徑與相對路徑 Python中的絕對路徑與相對路徑詳解什么是路徑&#xff1f;絕對路徑優點&#xff1a;缺點&#xff1a;示例&#xff1a; 相對路徑優點&#xff1a;缺點&#xff1a;示例&#xff1a; Python中如何使用**重點內容**&#xff1a;**在Python中&#xff0c;建議使用…

AVL Cruise與Simulink聯合仿真(通過MATLAB DLL方式)

最近畢業設計需要用到AVL Cruise與Simulink進行聯合仿真&#xff0c;分析汽車模型的經濟性。下面介紹一下我所知的AVL Cruise與Simulink聯合仿真的幾種方式&#xff0c;它們各自的優缺點&#xff0c;以及DLL方式聯合仿真的具體配置過程。我這里用的MATLAB軟件版本是2021a&#…

有邊數限制的最短路

文章目錄 題目 有邊數限制的最短路算法分析1、問題&#xff1a;為什么Dijkstra不能使用在含負權的圖中&#xff1f;dijkstra詳細步驟2、什么是bellman - ford算法&#xff1f;3、bellman - ford算法的具體步驟4、在下面代碼中&#xff0c;是否能到達n號點的判斷中需要進行if(di…

水準網間接平差

目錄 一、原理概述二、案例分析三、代碼實現 一、原理概述 間接平差的函數模型和隨機模型為&#xff1a; L ^ B X ^ d D σ 0 2 Q σ 0 2 P ? 1 \hat{L}B\hat{X}d\\ D\sigma_0^2Q\sigma_0^2P^{-1} L^BX^dDσ02?Qσ02?P?1 誤差方程為&#xff1a; V B x ^ ? l VB\ha…

信息系統項目管理師0104:詳細可行性研究(7項目立項管理—7.2項目可行性研究—7.2.3詳細可行性研究)

點擊查看專欄目錄 文章目錄 7.2.3詳細可行性研究1.詳細可行性研究的依據2.詳細可行性研究的原則3.詳細可行性研究的方法4.詳細可行性研究的內容5.詳細可行性研究報告記憶要點總結7.2.3詳細可行性研究 詳細可行性研究是在項目決策前對與項目有關的技術、經濟、

智慧公廁:打造智能、安全、舒適的公共廁所新時代

隨著智慧城市建設的不斷推進&#xff0c;公共設施的智能化也已成為一種必然趨勢。在這一背景下&#xff0c;智慧公廁作為城市管理的一個重要方面&#xff0c;正逐漸走進人們的視野。通過對所在轄區內所有公共廁所的全域感知、全網協同、全業務融合以及全場景智慧的賦能&#xf…

如何訓練一個大模型:LoRA篇

目錄 寫在前面 一、LoRA算法原理 1.設計思想 2.具體實現 二、peft庫 三、完整的訓練代碼 四、總結 寫在前面 現在有很多開源的大模型&#xff0c;他們一般都是通用的&#xff0c;這就意味著這些開源大模型在特定任務上可能力不從心。為了適應我們的下游任務&#xff0c;…

使用Python構建一個簡單的圖書管理系統

Python是一種強大而靈活的編程語言&#xff0c;它可以用于構建各種類型的應用程序&#xff0c;包括圖書管理系統。在這篇文章中&#xff0c;我們將學習如何使用Python和一些常見的庫來創建一個簡單的圖書管理系統。 1. 設計數據庫模型 首先&#xff0c;我們需要設計數據庫模型…

【退役之重學 Java】初步認識 AQS

一、AQS 是什么 Abstract Queued Synchronizer &#xff0c;翻譯過來就是“抽象的排好隊的同步器”。 AQS 是一個用來構建鎖和同步器的框架。是用來構建鎖或者其他同步器組件的重量級基礎框架及整個JUC體系的基石&#xff0c;通過內置的FIFO隊列來完成線程獲取資源的排隊工作&…

centos7時間同步教程

針對問題&#xff1a;在我們使用虛擬機配置好centos7后&#xff0c;發現服務器時間和當前時間對不上 通過命令查看時間不同步 date 或者 date -R修改/etc/sysconfig/clock文件如下內容&#xff0c;保存 vi /etc/sysconfig/clockZONE“Asia/Shanghai” UTCtrue ARCfalse重寫/e…

251 基于matlab的動態粒子群算法

基于matlab的動態粒子群算法。普通粒子群算法無法感知外界環境的變化&#xff0c;在外界環境發生改變時無法實時進行響應&#xff0c;因而缺乏動態環境尋優能力。在普通粒子群算法基本上通過增加敏感粒子得到一種動態粒子群算法&#xff0c;該算法通過實時計算敏感粒子的適應度…

2024年第七屆可再生能源與電力工程國際會議(REPE 2024)即將召開!

2024年第七屆可再生能源與電力工程國際會議&#xff08;REPE 2024&#xff09;將于2024年9月25-27日在中國北京召開, 由清華大學主辦。REPE 2024將匯聚國內外知名專家學者通過主旨報告、分組討論和互動交流等形式&#xff0c;分享最新的研究成果、技術進展和應用案例&#xff0…

【教程向】從零開始創建瀏覽器插件(二)深入理解 Chrome 擴展的 manifest.json 配置文件

第二步&#xff1a;深入理解 Chrome 擴展的 manifest.json 配置文件 上一次我們已經著手完成了一個自己的瀏覽器插件&#xff0c;鏈接在這里&#xff1a;我是鏈接 在本篇博客中&#xff0c;我們將更詳細地探討 Chrome 擴展中的 manifest.json 文件。這個文件是每個瀏覽器擴展…

docker容器實現https訪問

前言&#xff1a; 【云原生】docker容器實現https訪問_docker ssl訪問-CSDN博客 一術語介紹 ①key 私鑰 明文--自己生成&#xff08;genrsa &#xff09; ②csr 公鑰 由私鑰生成 ③crt 證書 公鑰 簽名&#xff08;自簽名或者由CA簽名&#xff09; ④證書&#xf…

C入門筆記

1. c文件執行過程 C語言程序的執行過程可以分為四個基本步驟&#xff1a;預處理、編譯、匯編和鏈接。下面是這些步驟的簡要概述&#xff1a; 預處理&#xff1a;在這個步驟中&#xff0c;預處理器將源代碼中以 # 開頭的指令進行處理&#xff0c;例如 #include 和 #define。預…

一般社保測試

SI 分析和 PI 分析主要有以下區別&#xff1a; SI 分析&#xff1a; 主要關注信號在傳輸過程中的質量&#xff0c;如信號的失真、反射、串擾等問題。 側重于確保信號的準確傳輸和接收&#xff0c;以實現可靠的數字或模擬信號通信。 PI 分析&#xff1a; 著重于電源分配網絡…