方便的回歸測試——diffy平台

  • 2019 年 12 月 10 日
  • 筆記

背景

前段時間,公司運維又雙叒叕在遷移機房,帶來的又是大量的回歸測試,雖然負責的項目case還算健全,但是被遷移機房仍然存在大量的歷史介面,有些甚至不知道是什麼業務在用,但仍然在有少量請求,既然還在為少量用戶提供服務,那就不能斷然下線,但是這種服務該怎麼回歸呢?

解決方案

這種情況最簡單的方案就是copy線上流量,通過工具diff結果來回歸;之前配合部門的開發做了一個結果diff工具,但是功能簡陋,無介面,操作十分複雜,結果diff全靠手動,用了幾次實在忍不了;加上之前忘記在哪個公眾號看到過diffy平台,所以決定試一下;

diffy介紹

diffy平台是Twitter開源的一個工具,通過配置可進行快速的結果對比,而且自帶雜訊過濾功能;工具原理參見下圖:

  1. diffy本身是一個代理服務(proxy),自己構造的http請求,打到proxy;
  2. proxy把請求分發到三個地方:被測服務(candidate)、一號生產環境(primary)、二號生產環境(secondary);
  3. 被測服務與一號生產環境的返回結果進行diff,生成 全集diff結果(raw differences);
  4. 一號生產環境與二號生產環境的返回結果進行diff,生成雜訊diff結果(non-deterministic noise);
  5. 通過去雜訊,得到最終的 diff結果(filtered differences);
  6. 最終結果會在平台提供的html頁面中展示;

如何部署

源碼地址

關於部署,google百度之後發現沒有一個可以說的明明白白的,希望本文能描述清楚;github上有兩個版本

  1. twitter/diffy:https://github.com/twitter/diffy
  2. opendiffy/diffy:https://github.com/opendiffy/diffytwitter/diffy猜測是有內部依賴,所以無法編譯成功;所以使用opendiffy/diffy進行編譯;
編譯方法

由於搜到的使用方法里能看到啟動用的是個jar包,所以一直以為是java開發的,但實際上diffy平台使用的是scala語言,運行環境是java虛擬機,所以需要安裝jdk,這裡建議安裝java8;編譯命令:

  • ./sbt assembly(這個過程十分漫長,有條件的同學建議掛個代理)

編譯好之後:diffy/target/scala-2.12/diffy-server.jar(diffy根目錄的相對路徑下)

啟動

java -jar ./target/scala-2.12/diffy-server.jar          -candidate='127.0.0.1:80'          -master.primary='127.0.0.1:81'          -master.secondary='127.0.0.1:82'          -service.protocol='http'          -serviceName='ExampleService'          -summary.delay='3' #重試的延遲時間          -summary.email='[email protected]'  #郵件地址必填參數,但是貌似沒啥用          -proxy.port=:8880  #http服務埠,結果查看頁面          -admin.port=:8881  #查看請求狀況http://localhost:8881/admin          -http.port=:8888 #proxy埠          -allowHttpSideEffects=true #無此參數只支援get請求          -excludeHttpHeadersComparison=false #是否排除header的差異,不同伺服器,cookie,nginx版本可能有所差異,設置為true可以忽略這些差異

請求

測試case可使用大量線上流量(通過goreplay等工具)進行回放;或已有的介面測試用例;或構造大量隨機用例;優點是不用關注結果正確性;

結果頁面

注意事項

  1. master.primary和master.secondary 如果直接使用線上環境要確認是否有資料庫增、改、寫的操作,有類似操作的介面不建議直接使用線上環境,會造成線上資料庫被灌入臟數據;
  2. 由於diffy平台目標是diffy結果,所以構造流量最好慢一點打到proxy介面,實測30qps以下功能基本穩定,大於30會有卡住的情況;
  3. 頁面里看不到真實uri,如下圖:

作者對此問題的解釋是:大部分請求都包含請求參數,如果將所有參數展現到頁面會大大降低用戶體驗,所以建議用戶自定義uri