《軟件工程》第 12 章 - 軟件測試

? ?軟件測試是確保軟件質量的關鍵環節,它通過執行程序來發現錯誤,驗證軟件是否滿足需求。本章將依據目錄,結合 Java 代碼示例、可視化圖表,深入講解軟件測試的概念、過程、方法及實踐。

12.1 軟件測試的概念

12.1.1 軟件測試的任務

軟件測試的主要任務是:

  1. 發現錯誤:通過執行程序,找出代碼中的缺陷和邏輯錯誤
  2. 驗證功能:確保軟件滿足用戶需求和規格說明。
  3. 評估質量:對軟件的可靠性、性能等質量屬性進行評估。

12.1.2 測試階段的信息流程

測試階段的信息流程:

展示測試過程中的信息流轉。

12.1.3 測試用例及其設計

? ?測試用例是為測試而設計的一組輸入和預期輸出,用于驗證軟件的特定功能。例如,測試一個簡單的加法函數的測試用例:

public class Calculator {public int add(int a, int b) {return a + b;}
}// 對應的測試用例(使用JUnit框架)
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class CalculatorTest {@Testpublic void testAddPositiveNumbers() {Calculator calculator = new Calculator();int result = calculator.add(3, 5);assertEquals(8, result); // 預期結果為8}@Testpublic void testAddNegativeNumbers() {Calculator calculator = new Calculator();int result = calculator.add(-3, -5);assertEquals(-8, result); // 預期結果為-8}
}

12.1.4 軟件測試的原則

軟件測試應遵循以下原則:

  1. 盡早測試:測試應從軟件開發的早期階段開始,如需求分析和設計階段。
  2. 全面測試覆蓋所有可能的輸入和場景,包括邊界條件和異常情況
  3. 避免自測:開發人員應避免測試自己編寫的代碼,減少主觀因素影響。
  4. 記錄測試結果:詳細記錄測試過程和結果,便于追蹤和分析。

12.2 軟件測試的過程模型

? ?軟件測試的過程模型通常與軟件開發過程模型對應,常見的有 V 模型、W 模型等。以 V 模型為例:

展示 V 模型中測試階段與開發階段的對應關系。

12.3 軟件測試方法

12.3.1 白盒測試

白盒測試基于代碼的內部結構和邏輯,主要技術包括:

  • 語句覆蓋:確保每個語句至少執行一次。
  • 判定覆蓋:確保每個判定的真假分支至少執行一次。
  • 條件覆蓋:確保每個判定中的每個條件的可能取值至少執行一次。

示例代碼及測試用例:

public class ControlFlow {public boolean checkNumber(int num) {if (num > 10 && num % 2 == 0) {return true;} else {return false;}}
}// 白盒測試用例
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class ControlFlowTest {@Testpublic void testCheckNumberTrue() {ControlFlow cf = new ControlFlow();assertTrue(cf.checkNumber(12)); // 覆蓋true分支}@Testpublic void testCheckNumberFalse1() {ControlFlow cf = new ControlFlow();assertFalse(cf.checkNumber(5)); // 覆蓋false分支(num <= 10)}@Testpublic void testCheckNumberFalse2() {ControlFlow cf = new ControlFlow();assertFalse(cf.checkNumber(11)); // 覆蓋false分支(num為奇數)}
}

12.3.2 黑盒測試

? ?黑盒測試基于軟件的外部功能和需求,不考慮內部實現。主要技術包括:

  • 等價類劃分:將輸入域劃分為若干等價類,從每個等價類中選取代表性值作為測試用例。
  • 邊界值分析:選擇輸入域的邊界值作為測試用例,如最小值、最大值、剛好超過邊界的值。
  • 錯誤推測法:基于經驗和直覺推測可能的錯誤,設計針對性的測試用例。

以三角形分類函數為例:

public class TriangleClassifier {public String classify(int a, int b, int c) {// 檢查是否構成三角形if (a <= 0 || b <= 0 || c <= 0 || a + b <= c || a + c <= b || b + c <= a) {return "非三角形";}// 檢查等邊三角形if (a == b && b == c) {return "等邊三角形";}// 檢查等腰三角形if (a == b || a == c || b == c) {return "等腰三角形";}// 普通三角形return "普通三角形";}
}// 黑盒測試用例(等價類劃分和邊界值分析)
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class TriangleClassifierTest {@Testpublic void testEquilateralTriangle() {TriangleClassifier tc = new TriangleClassifier();assertEquals("等邊三角形", tc.classify(3, 3, 3));}@Testpublic void testIsoscelesTriangle() {TriangleClassifier tc = new TriangleClassifier();assertEquals("等腰三角形", tc.classify(3, 3, 4));}@Testpublic void testScaleneTriangle() {TriangleClassifier tc = new TriangleClassifier();assertEquals("普通三角形", tc.classify(3, 4, 5));}@Testpublic void testNotTriangle() {TriangleClassifier tc = new TriangleClassifier();assertEquals("非三角形", tc.classify(1, 2, 3));}@Testpublic void testBoundaryValues() {TriangleClassifier tc = new TriangleClassifier();assertEquals("非三角形", tc.classify(0, 3, 4)); // 邊界值0assertEquals("等腰三角形", tc.classify(2, 2, 4)); // 邊界值a+b=c}
}

12.4 軟件測試活動及實施策略

12.4.1 單元測試

? ?單元測試是對軟件中的最小可測試單元(如方法、類)進行測試。例如,測試一個棧類的基本操作:

import java.util.EmptyStackException;public class Stack {private int[] array;private int top;private int capacity;public Stack(int capacity) {this.capacity = capacity;this.array = new int[capacity];this.top = -1;}public void push(int item) {if (top == capacity - 1) {throw new StackOverflowError("棧已滿");}array[++top] = item;}public int pop() {if (isEmpty()) {throw new EmptyStackException();}return array[top--];}public int peek() {if (isEmpty()) {throw new EmptyStackException();}return array[top];}public boolean isEmpty() {return top == -1;}
}// 單元測試用例
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class StackTest {private Stack stack;@BeforeEachpublic void setUp() {stack = new Stack(5);}@Testpublic void testPushAndPop() {stack.push(10);stack.push(20);assertEquals(20, stack.pop());assertEquals(10, stack.pop());}@Testpublic void testPeek() {stack.push(10);assertEquals(10, stack.peek());assertEquals(10, stack.peek()); // 多次peek不應改變棧}@Testpublic void testEmptyStack() {assertTrue(stack.isEmpty());assertThrows(EmptyStackException.class, () -> stack.pop());assertThrows(EmptyStackException.class, () -> stack.peek());}@Testpublic void testStackOverflow() {for (int i = 0; i < 5; i++) {stack.push(i);}assertThrows(StackOverflowError.class, () -> stack.push(5));}
}

12.4.2 集成測試

? ?集成測試是將多個單元組合成更大的模塊進行測試,驗證模塊間的交互。例如,測試一個簡單的訂單處理系統:

// 訂單類
public class Order {private String orderId;private double totalAmount;private boolean paid;public Order(String orderId, double totalAmount) {this.orderId = orderId;this.totalAmount = totalAmount;this.paid = false;}public String getOrderId() {return orderId;}public double getTotalAmount() {return totalAmount;}public boolean isPaid() {return paid;}public void setPaid(boolean paid) {this.paid = paid;}
}// 支付服務接口
public interface PaymentService {boolean processPayment(double amount);
}// 訂單處理服務
public class OrderService {private PaymentService paymentService;public OrderService(PaymentService paymentService) {this.paymentService = paymentService;}public boolean checkout(Order order) {if (order.isPaid()) {return false;}boolean paymentResult = paymentService.processPayment(order.getTotalAmount());if (paymentResult) {order.setPaid(true);return true;}return false;}
}// 集成測試用例
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;public class OrderServiceIntegrationTest {@Testpublic void testCheckoutSuccess() {// 創建模擬的支付服務PaymentService paymentService = mock(PaymentService.class);when(paymentService.processPayment(100.0)).thenReturn(true);// 創建訂單服務并注入模擬的支付服務OrderService orderService = new OrderService(paymentService);Order order = new Order("ORD123", 100.0);// 執行測試boolean result = orderService.checkout(order);// 驗證結果assertTrue(result);assertTrue(order.isPaid());verify(paymentService, times(1)).processPayment(100.0);}@Testpublic void testCheckoutFailure() {PaymentService paymentService = mock(PaymentService.class);when(paymentService.processPayment(100.0)).thenReturn(false);OrderService orderService = new OrderService(paymentService);Order order = new Order("ORD123", 100.0);boolean result = orderService.checkout(order);assertFalse(result);assertFalse(order.isPaid());verify(paymentService, times(1)).processPayment(100.0);}
}

12.4.3 確認測試

? ?確認測試驗證軟件是否滿足用戶需求和規格說明,通常包括功能測試、性能測試等。例如,測試一個用戶注冊功能:

// 用戶類
public class User {private String username;private String email;private String password;public User(String username, String email, String password) {this.username = username;this.email = email;this.password = password;}// Getters and setterspublic String getUsername() { return username; }public String getEmail() { return email; }public String getPassword() { return password; }
}// 用戶服務接口
public interface UserService {boolean registerUser(User user);boolean isValidEmail(String email);
}// 用戶服務實現
public class UserServiceImpl implements UserService {@Overridepublic boolean registerUser(User user) {// 驗證郵箱格式if (!isValidEmail(user.getEmail())) {return false;}// 驗證用戶名和密碼長度if (user.getUsername().length() < 3 || user.getPassword().length() < 6) {return false;}// 模擬保存用戶到數據庫System.out.println("用戶注冊成功: " + user.getUsername());return true;}@Overridepublic boolean isValidEmail(String email) {// 簡單的郵箱格式驗證return email.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$");}
}// 確認測試用例
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class UserServiceVerificationTest {@Testpublic void testRegisterUserSuccess() {UserService userService = new UserServiceImpl();User user = new User("john_doe", "john@example.com", "password123");assertTrue(userService.registerUser(user));}@Testpublic void testRegisterUserInvalidEmail() {UserService userService = new UserServiceImpl();User user = new User("john_doe", "invalid_email", "password123");assertFalse(userService.registerUser(user));}@Testpublic void testRegisterUserShortUsername() {UserService userService = new UserServiceImpl();User user = new User("jo", "john@example.com", "password123");assertFalse(userService.registerUser(user));}@Testpublic void testRegisterUserShortPassword() {UserService userService = new UserServiceImpl();User user = new User("john_doe", "john@example.com", "pass");assertFalse(userService.registerUser(user));}
}

12.4.4 系統測試

? ? 系統測試將軟件作為一個整體進行測試,驗證系統是否滿足需求。例如,測試一個在線購物系統的完整流程:

// 商品類
public class Product {private String productId;private String name;private double price;private int stock;public Product(String productId, String name, double price, int stock) {this.productId = productId;this.name = name;this.price = price;this.stock = stock;}// Getters and setterspublic String getProductId() { return productId; }public String getName() { return name; }public double getPrice() { return price; }public int getStock() { return stock; }public void setStock(int stock) { this.stock = stock; }
}// 購物車類
public class ShoppingCart {private Map<Product, Integer> items = new HashMap<>();public void addItem(Product product, int quantity) {items.put(product, items.getOrDefault(product, 0) + quantity);}public void removeItem(Product product) {items.remove(product);}public double getTotalPrice() {double total = 0;for (Map.Entry<Product, Integer> entry : items.entrySet()) {total += entry.getKey().getPrice() * entry.getValue();}return total;}public Map<Product, Integer> getItems() {return items;}
}// 訂單類
public class Order {private String orderId;private List<Product> products;private double totalAmount;private OrderStatus status;public Order(String orderId, List<Product> products, double totalAmount) {this.orderId = orderId;this.products = products;this.totalAmount = totalAmount;this.status = OrderStatus.PENDING;}// Getters and setterspublic String getOrderId() { return orderId; }public List<Product> getProducts() { return products; }public double getTotalAmount() { return totalAmount; }public OrderStatus getStatus() { return status; }public void setStatus(OrderStatus status) { this.status = status; }
}// 訂單狀態枚舉
public enum OrderStatus {PENDING, PAID, SHIPPED, DELIVERED, CANCELLED
}// 系統測試用例
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class ShoppingSystemSystemTest {@Testpublic void testEndToEndShoppingFlow() {// 創建商品Product laptop = new Product("P001", "筆記本電腦", 5000.0, 10);Product mouse = new Product("P002", "鼠標", 50.0, 20);// 創建購物車ShoppingCart cart = new ShoppingCart();cart.addItem(laptop, 1);cart.addItem(mouse, 2);// 驗證購物車總價assertEquals(5100.0, cart.getTotalPrice(), 0.001);// 創建訂單String orderId = "ORD" + System.currentTimeMillis();Order order = new Order(orderId, cart.getItems().keySet().stream().collect(Collectors.toList()), cart.getTotalPrice());// 處理訂單支付order.setStatus(OrderStatus.PAID);assertEquals(OrderStatus.PAID, order.getStatus());// 更新庫存for (Map.Entry<Product, Integer> entry : cart.getItems().entrySet()) {entry.getKey().setStock(entry.getKey().getStock() - entry.getValue());}// 驗證庫存更新assertEquals(9, laptop.getStock());assertEquals(18, mouse.getStock());// 發貨order.setStatus(OrderStatus.SHIPPED);assertEquals(OrderStatus.SHIPPED, order.getStatus());// 確認收貨order.setStatus(OrderStatus.DELIVERED);assertEquals(OrderStatus.DELIVERED, order.getStatus());}
}

12.5 面向對象軟件的測試

12.5.1 類的測試

? ?類的測試關注類的屬性、方法和狀態。例如,測試一個銀行賬戶類:

public class BankAccount {private String accountNumber;private double balance;private AccountStatus status;public BankAccount(String accountNumber, double initialBalance) {this.accountNumber = accountNumber;this.balance = initialBalance;this.status = AccountStatus.ACTIVE;}public void deposit(double amount) {if (amount <= 0) {throw new IllegalArgumentException("存款金額必須大于0");}if (status != AccountStatus.ACTIVE) {throw new IllegalStateException("賬戶狀態異常,無法存款");}balance += amount;}public void withdraw(double amount) {if (amount <= 0) {throw new IllegalArgumentException("取款金額必須大于0");}if (status != AccountStatus.ACTIVE) {throw new IllegalStateException("賬戶狀態異常,無法取款");}if (amount > balance) {throw new InsufficientFundsException("余額不足");}balance -= amount;}public void close() {if (balance != 0) {throw new IllegalStateException("賬戶余額不為0,無法關閉");}status = AccountStatus.CLOSED;}// Getterspublic String getAccountNumber() { return accountNumber; }public double getBalance() { return balance; }public AccountStatus getStatus() { return status; }
}// 賬戶狀態枚舉
public enum AccountStatus {ACTIVE, CLOSED, FROZEN
}// 自定義異常
public class InsufficientFundsException extends RuntimeException {public InsufficientFundsException(String message) {super(message);}
}// 類的測試用例
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class BankAccountTest {private BankAccount account;@BeforeEachpublic void setUp() {account = new BankAccount("123456", 1000.0);}@Testpublic void testInitialState() {assertEquals("123456", account.getAccountNumber());assertEquals(1000.0, account.getBalance(), 0.001);assertEquals(AccountStatus.ACTIVE, account.getStatus());}@Testpublic void testDeposit() {account.deposit(500.0);assertEquals(1500.0, account.getBalance(), 0.001);}@Testpublic void testDepositNegativeAmount() {assertThrows(IllegalArgumentException.class, () -> account.deposit(-100.0));}@Testpublic void testWithdraw() {account.withdraw(300.0);assertEquals(700.0, account.getBalance(), 0.001);}@Testpublic void testWithdrawInsufficientFunds() {assertThrows(InsufficientFundsException.class, () -> account.withdraw(1500.0));}@Testpublic void testCloseAccount() {account.withdraw(1000.0); // 清空余額account.close();assertEquals(AccountStatus.CLOSED, account.getStatus());}@Testpublic void testCloseAccountWithBalance() {assertThrows(IllegalStateException.class, () -> account.close());}
}

12.5.2 交互測試

? ?交互測試驗證對象之間的協作和交互。例如,測試一個訂單處理系統中對象間的交互:

// 訂單類
public class Order {private String orderId;private List<OrderItem> items;private OrderStatus status;public Order(String orderId, List<OrderItem> items) {this.orderId = orderId;this.items = items;this.status = OrderStatus.PENDING;}public void processPayment(PaymentService paymentService) {double totalAmount = calculateTotalAmount();boolean paymentResult = paymentService.processPayment(totalAmount);if (paymentResult) {this.status = OrderStatus.PAID;}}private double calculateTotalAmount() {double total = 0;for (OrderItem item : items) {total += item.getProduct().getPrice() * item.getQuantity();}return total;}// Getters and setterspublic String getOrderId() { return orderId; }public List<OrderItem> getItems() { return items; }public OrderStatus getStatus() { return status; }
}// 訂單條目類
public class OrderItem {private Product product;private int quantity;public OrderItem(Product product, int quantity) {this.product = product;this.quantity = quantity;}// Getterspublic Product getProduct() { return product; }public int getQuantity() { return quantity; }
}// 商品類
public class Product {private String productId;private String name;private double price;public Product(String productId, String name, double price) {this.productId = productId;this.name = name;this.price = price;}// Getterspublic String getProductId() { return productId; }public String getName() { return name; }public double getPrice() { return price; }
}// 支付服務接口
public interface PaymentService {boolean processPayment(double amount);
}// 交互測試用例
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;public class OrderInteractionTest {@Testpublic void testOrderPaymentProcess() {// 創建模擬的支付服務PaymentService paymentService = mock(PaymentService.class);when(paymentService.processPayment(100.0)).thenReturn(true);// 創建商品和訂單條目Product product = new Product("P001", "手機", 100.0);OrderItem item = new OrderItem(product, 1);// 創建訂單Order order = new Order("ORD123", List.of(item));// 處理支付order.processPayment(paymentService);// 驗證結果assertEquals(OrderStatus.PAID, order.getStatus());verify(paymentService, times(1)).processPayment(100.0);}@Testpublic void testOrderPaymentFailure() {PaymentService paymentService = mock(PaymentService.class);when(paymentService.processPayment(100.0)).thenReturn(false);Product product = new Product("P001", "手機", 100.0);OrderItem item = new OrderItem(product, 1);Order order = new Order("ORD123", List.of(item));order.processPayment(paymentService);assertEquals(OrderStatus.PENDING, order.getStatus());verify(paymentService, times(1)).processPayment(100.0);}
}

12.5.3 繼承的測試

? ?繼承的測試關注子類與父類的關系,以及多態的正確性。例如,測試一個形狀繼承體系:

// 抽象形狀類
public abstract class Shape {public abstract double calculateArea();public abstract double calculatePerimeter();
}// 矩形類
public class Rectangle extends Shape {private double length;private double width;public Rectangle(double length, double width) {this.length = length;this.width = width;}@Overridepublic double calculateArea() {return length * width;}@Overridepublic double calculatePerimeter() {return 2 * (length + width);}
}// 正方形類
public class Square extends Rectangle {public Square(double side) {super(side, side);}
}// 圓形類
public class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double calculateArea() {return Math.PI * radius * radius;}@Overridepublic double calculatePerimeter() {return 2 * Math.PI * radius;}
}// 繼承測試用例
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class ShapeInheritanceTest {@Testpublic void testRectangleArea() {Rectangle rectangle = new Rectangle(5.0, 3.0);assertEquals(15.0, rectangle.calculateArea(), 0.001);assertEquals(16.0, rectangle.calculatePerimeter(), 0.001);}@Testpublic void testSquareArea() {Square square = new Square(4.0);assertEquals(16.0, square.calculateArea(), 0.001);assertEquals(16.0, square.calculatePerimeter(), 0.001);}@Testpublic void testCircleArea() {Circle circle = new Circle(2.0);assertEquals(Math.PI * 4.0, circle.calculateArea(), 0.001);assertEquals(2 * Math.PI * 2.0, circle.calculatePerimeter(), 0.001);}@Testpublic void testPolymorphism() {Shape rectangle = new Rectangle(5.0, 3.0);Shape square = new Square(4.0);Shape circle = new Circle(2.0);assertEquals(15.0, rectangle.calculateArea(), 0.001);assertEquals(16.0, square.calculateArea(), 0.001);assertEquals(Math.PI * 4.0, circle.calculateArea(), 0.001);}
}

12.6小結

? ?軟件測試是軟件開發過程中不可或缺的環節,它貫穿于整個軟件生命周期。通過本章的學習,我們了解了軟件測試的概念、過程模型、測試方法以及面向對象軟件的測試技術。合理運用各種測試方法和技術,能夠有效發現軟件中的缺陷,提高軟件質量,確保軟件滿足用戶需求。在實際項目中,應根據項目特點和需求,選擇合適的測試策略和方法,制定全面的測試計劃,以保證軟件的可靠性和穩定性。

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

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

相關文章

面試題 08.08. 有重復字符串的排列組合【 力扣(LeetCode) 】

文章目錄 零、原題鏈接一、題目描述二、測試用例三、解題思路四、參考代碼 零、原題鏈接 面試題 08.08. 有重復字符串的排列組合 一、題目描述 有重復字符串的排列組合。編寫一種方法&#xff0c;計算某字符串的所有排列組合。 二、測試用例 示例 1&#xff1a; 輸入&#…

【Linux】關于權限的理解

目錄 一、Linux用戶的分類 1.Linux下的兩種用戶 2.兩種用戶提示符的區別 3.用戶的切換方法 二、Linux的權限管理 1.文件訪問者分類 2.常見文件類型 3.文件訪問權限 4.權限檢查邏輯 5.文件權限的表示方式 三、與文件訪問權限相關的設置方法 1.前提&#xff1a; 2.如…

前端antd,后端fastapi,解決文件上傳

一、技術架構概述 前端框架&#xff1a;React Ant Design 5.x 使用antd的Upload組件&#xff08;支持拖拽/多文件/分片&#xff09; 后端框架&#xff1a;Python FastAPI 利用UploadFile類處理文件流 傳輸協議&#xff1a;HTTP FormData&#xff08;兼容性強&#xff09; 二…

?????? 模擬題及答案 ?????? 大模型Clouder認證:RAG應用構建及優化

考試注意事項: 一、單選題(21題) 檢索增強生成(RAG)的核心技術結合了什么? A. 圖像識別與自然語言處理 B. 信息檢索與文本生成 C. 語音識別與知識圖譜 D. 數據挖掘與機器學習 RAG技術中,“建立索引”步驟不包括以下哪項操作? A. 將文檔解析為純文本 B. 文本片段分割(…

為什么建立 TCP 連接時,初始序列號不固定?

主要原因有兩個方面&#xff1a; 很大程度上避免歷史報文被下一個相同四元組的 TCP 連接接收問題&#xff08;主要方面&#xff09;防止黑客偽造相同序列號的 TCP 報文被接收 接下來&#xff0c;詳細說說第一點 假設每次建立 TCP 連接時&#xff0c;客戶端和服務端的初始序列…

VScode-使用技巧-持續更新

一、Visual Studio Code - MACOS版本 復制當前行 shiftoption方向鍵?? 同時復制多行 shiftoption 批量替換換行 在查找和替換面板中&#xff0c;你會看到一個 .? 圖標&#xff08;表示啟用正則表達式&#xff09;。確保這個選項被選中&#xff0c;因為我們需要使用正則…

【瑤池數據庫訓練營及解決方案本周精選(探索PolarDB,參與RDS遷移、連接訓練營)】

一、訓練營 數據庫遷移訓練營 自建數據庫運維難&#xff1f;本次訓練營教您遷移至云數據庫 RDS&#xff0c;高可用架構跨區容災&#xff0c;降本增效&#xff01;模擬教程 實戰演練&#xff0c;零基礎也能上手。 &#xff08;一&#xff09;開營時間 2025年4月8日-6月2日16…

Xamarin勸退之踩坑筆記

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

使用ray擴展python應用之流式處理應用

流式處理就是數據一來&#xff0c;咱們就得趕緊處理&#xff0c;不能攢批再算。這里的實時不是指瞬間完成&#xff0c;而是要在數據產生的那一刻&#xff0c;或者非常接近那個時間點&#xff0c;就做出響應。這種處理方式&#xff0c;我們稱之為流式處理。 流式處理的應用場景…

火狐安裝自動錄制表單教程——仙盟自動化運營大衍靈機——仙盟創夢IDE

打開火狐插件頁面 安裝完成 使用 功能 錄制瀏覽器操作 錄入地址 開始操作 錄制完成 在當今快速發展的軟件開發生態中&#xff0c;自動化測試已從一種新興技術手段&#xff0c;轉變為保障軟件質量與開發效率不可或缺的關鍵環節。其重要性體現在多個維度&#xff0c;同時&#x…

小程序 - 視圖與邏輯

個人簡介 ??????個人主頁: 魔術師 ??學習方向: 主攻前端方向,正逐漸往全棧發展 ??個人狀態: 研發工程師,現效力于政務服務網事業 ????人生格言: “心有多大,舞臺就有多大。” ??推薦學習: ??Vue2 ??Vue3 ??Vue2/3項目實戰 ??Node.js實戰 ??T…

【LLM應用開發】上下文記憶的解決方案(主流全面)

一、前言 上下文記憶&#xff08;Contextual Memory&#xff09;解決方案的作用&#xff1a; 提升 AI&#xff08;尤其是大語言模型&#xff0c;LLM&#xff09;的對話連貫性和個性化。 本文將介紹幾個主流的實現方式。 二、&#x1f9e0; 什么是上下文記憶&#xff1f; 在對…

C/C++ 面試復習筆記(2)

C語言如何實現快速排序算法&#xff1f; 答案&#xff1a;快排是一種分治算法&#xff0c;選擇一個基準元素&#xff0c;將數據劃分成兩部分&#xff0c;然后遞歸排序 補充&#xff1a; void quick_sort(int arr[], int start, int end) {//判斷是否需要排序if (start > …

2025吉林CCPC 題解(前六題)

// Problem: J - Odd-Even Game // Contest: Virtual Judge - sdccpc20250527 // URL: https://vjudge.net/contest/719585#problem/J // Memory Limit: 1024 MB // Time Limit: 1000 ms // 簽到題 // Powered by CP Editor (https://cpeditor.org)#include <bits/std…

Q: dify知識庫模塊主要庫表和字段

【回到目錄】~~~~【回到問題集】 Q: dify知識庫模塊主要庫表和字段 A: 表1&#xff1a;datasets 知識庫表 name 知識庫名稱 index_struct 向量索引node 表2&#xff1a;document 文檔表 name 文檔名稱 word_count 字數 doc_form 分段類型(hierarchical_model、qa_model、te…

NodeMediaEdge快速上手

NodeMediaEdge快速上手 簡介 NodeMediaEdge是一款部署在監控攝像機網絡前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http視頻流并使用rtmp/kmp推送到公網流媒體服務器的工具。 通過云平臺協議注冊到NodeMediaServer后&#xff0c;可以同NodeMediaServer結合使用。使用圖形化的…

通用前端框架項目靜態部署到Hugging Face Space的實踐指南

背景介紹 在輕量級展示前端項目的場景中,Hugging Face Space 提供了一個便捷的靜態托管平臺。需求是將無后端服務的Vite的 Vue項目部署到Hugging Face Space 上。其實無論是基于Vite的Vue/React項目,還是使用Webpack構建的工程化方案,都可以通過兩種方式將其部署到Space:自…

Android studio 查看aar源碼出現/* compiled code */

如圖查看aar源碼時看不到具體實現&#xff0c;在排除是sdk版本導致的問題后&#xff0c;下面說解決方法 打開設置&#xff0c;找到插件 輸入decompiler 搜索 這個是自帶的反編譯工具&#xff0c;啟用就好了

Spark實時流數據處理實例(SparkStreaming通話記錄消息處理)

所用資源&#xff1a; 通過網盤分享的文件&#xff1a;spark-streaming-kafka-0-8-assembly_2.11-2.4.8.jar等4個文件 鏈接: https://pan.baidu.com/s/1zYHu29tLgDvS_L2Ud-22ZA?pwdhnpg 提取碼: hnpg 1.需求分析 &#xff1a; 假定有一個手機通信計費系統&#xff0c;用戶通…

Vue3處理number輸入框避免NaN

在 Vue3 中處理 number 類型輸入框避免顯示 NaN&#xff0c;核心在于正確處理用戶輸入的非數字值。以下是幾種解決方案&#xff1a; 方案1&#xff1a;使用字符串中轉 計算屬性&#xff08;推薦&#xff09; vue 復制 下載 <template><input v-model"input…