【硬核乾貨】10 分鐘徹底搞懂分散式/本地事務測試!資深測試工程師保姆餵飯式教你快速驗證資料一致性(附實戰案例)

lv發表於2025-03-03

最近面試了 7 家公司,戰況還不錯,拿到了 4 家公司的口頭或書面 offer,其中不乏 web3 領域大廠,後面會寫篇文章詳細聊聊這塊經歷。

在這麼多場面試中,有個場景測試題,讓我印象深刻,打算寫篇文章由淺入深聊聊這道題,如果深入去分析這道題,可能會扒出來很多後端技術問題,對於想提高服務端測試技巧的小夥伴來說,可以極大擴寬知識面。

面試題如下:“假如專案中有兩個服務,分別為 A 和 B,使用者在前端頁面新建一條資料提交至 A 服務後端,A 服務要把資料落入本地資料庫中兩個表,然後再同步呼叫 B 服務的介面,進行資料同步,這個場景如果讓你去測試,請列出測試點”。

題目總體來說偏白盒,習慣做黑盒測試的小夥伴,看到這道題可能有點懵圈,不過沒關係,可以看看下圖,為了方便理解,我打算使用電商系統中,訂單服務和物流服務之間某個簡單業務流的互動進行類比:

從截圖中可以看到,這是一個簡單的訂單服務和物流服務的時序圖,描述了使用者提交訂單請求以及訂單服務與資料庫和物流服務的互動流程。具體的業務流程如下:

1、使用者提交訂單請求: 使用者透過前端頁面提交訂單建立請求。

2、插入訂單總表: 訂單服務將訂單的總資訊插入到資料庫的訂單總表中。

3、插入訂單詳情表: 同時,訂單服務將訂單的詳細資訊插入到資料庫的訂單詳情表中。

4、呼叫物流服務介面:訂單服務呼叫物流服務 API,傳送訂單的物流資訊並請求同步物流處理。

5、返回處理結果:
物流服務處理完訂單的物流資訊後,返回處理結果給訂單服務,最後訂 單服務返回訂單處理的結果給使用者。
該圖簡潔地展示了訂單服務如何與資料庫和物流服務進行互動,以確保訂單建立和物流同步的過程。

虛擬碼如下:


// 訂單服務public class OrderService {
    private OrderDatabase orderDatabase;    private LogisticsService logisticsService;
    public OrderService(OrderDatabase orderDatabase, LogisticsService logisticsService) {        this.orderDatabase = orderDatabase;        this.logisticsService = logisticsService;    }
    public void processOrder(Order order) {        // 1. 使用者提交訂單請求,開始處理訂單        System.out.println("使用者提交訂單請求...");
        // 2. 插入訂單總表        boolean orderInsertSuccess = orderDatabase.insertOrder(order);        if (orderInsertSuccess) {            System.out.println("插入訂單總表成功。");        } else {            System.out.println("插入訂單總表失敗。");            return; // 如果插入失敗,終止後續操作        }
        // 3. 插入訂單詳情表        boolean orderDetailsInsertSuccess = orderDatabase.insertOrderDetails(order.getOrderDetails());        if (orderDetailsInsertSuccess) {            System.out.println("插入訂單詳情表成功。");        } else {            System.out.println("插入訂單詳情表失敗。");            return; // 如果插入失敗,終止後續操作        }
        // 4. 呼叫物流服務介面,傳送物流資訊        boolean logisticsSyncSuccess = logisticsService.syncLogistics(order);        if (logisticsSyncSuccess) {            System.out.println("訂單物流資訊同步成功。");        } else {            System.out.println("訂單物流資訊同步失敗。");            return; // 如果物流同步失敗,終止後續操作        }
        // 5. 返回訂單處理結果        System.out.println("訂單處理成功。");    }}
// 訂單資料庫類public class OrderDatabase {
    public boolean insertOrder(Order order) {        // 模擬插入訂單總表        // 實際操作中,這裡將執行SQL插入操作        return true; // 返回插入是否成功    }
    public boolean insertOrderDetails(List<OrderDetail> orderDetails) {        // 模擬插入訂單詳情表        // 實際操作中,這裡將執行SQL插入操作        return true; // 返回插入是否成功    }}
// 物流服務類public class LogisticsService {
    public boolean syncLogistics(Order order) {        // 模擬呼叫物流服務API        // 這裡會呼叫外部API同步物流資訊        return true; // 返回物流同步是否成功    }}
// 訂單類public class Order {    private int orderId;    private List<OrderDetail> orderDetails;
    // 建構函式、getter、setter方法省略}
// 訂單詳情類public class OrderDetail {    private int productId;    private int quantity;    private double price;
    // 建構函式、getter、setter方法省略}

相關文章