整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          簡單小程序:登錄頁面(html)

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>登錄頁面</title>
              /*總體的樣式*/
              <style>
              	/*盒子樣式*/
                  #box{
                      width: 350px; //寬
                      height: 450px; //高
                      border: 1px solid black; //邊框
                      border-radius: 10px; //邊框弧度
                      font-family: 黑體; //字體
                      letter-spacing:8px; //段間距
                      word-spacing: 10px; //字間距
                      line-height: 40px; //行高
                      font-size: 18px; //字大小
                      padding: 20px; //內邊框
                  }
                  /*給'注冊'賦予樣式*/
                  .register{
                      width:280px ; //寬
                      height: 50px; //高
                      background-color: skyblue; //背景顏色
                      border-radius: 10px; //邊框弧度
          
                  }
                  /*將所有邊框都改變*/
                  *{
                      border-radius: 5px; 邊框弧度
                  }
                  /*使用class選擇器,賦予number寬高和邊框*/
                  .number{
                      width: 185px; //寬
                      height: 27px; //高
                      border-width: 1px; //邊框寬度
          
                  }
                  /*id選擇器*/
                  #two{
                      width: 55px; //寬
                      border-width: 1px; 邊框寬度
                  }
                  /*id選擇器*/
                  #phone{
                      width: 103px; //寬
                  }
                  /*class 選擇器*/
                  .boxs{
                      zoom: 75%; //清除浮動
                      color: darkgray; //顏色
                  }
                  /*class選擇器*/
                  .box_a{
                      width: 50px; //寬
                      height: 50px; //高
                      background-image: url("../image/04.jpg "); //背景圖片
                      background-repeat: no-repeat; // 是否平鋪
                      background-size: 50px 25px; //背景尺寸
                      position: relative; //定位 相對定位
                      left: 310px; //定位后左移
                      bottom: 32px; //定位后下移
          
                  }
              </style>
          </head>
          <body>
          <div id="box">
              <h1>請注冊</h1>
          <p style="color: darkgray">已有帳號?<a href="https://im.qq.com/index">登錄</a></p>
          <form action="" method="post">
              <label for="name">用戶名</label>
              <input type="text" placeholder="請輸入用戶名" id="name" class="number"> <br>
              <label for="phone">手機號</label>
              <select name="" id="two" class="number">
              <optgroup>
                  <option style="" class="">+86</option>
              </optgroup>
              </select>
              <input type="text" placeholder="請輸入手機號" id="phone" class="number"> <br>
              <label for="mima">密?碼</label>
              <input type="password" placeholder="請輸入密碼" id="mima" class="number"> <br>
              <label for="mima">驗證碼</label>
              <input type="password" placeholder="請輸入驗證碼" id="is" class="number">
              <div class="box_a"></div>
              <div class="boxs">
                  <input type="radio" id="" class="accept">閱讀并接受協議<br>
              </div>
              <input type="submit" value="注冊" class="register" >
          
              </form>
          </div>
          
          
          </body>
          </html>
          在這里插入圖片描述

          家好,很高興又見面了,我是姜茶的編程筆記,我們一起學習前端相關領域技術,共同進步,也歡迎大家關注、點贊、收藏、轉發,您的支持是我不斷創作的動力

          在 JavaScript 中,Array.prototype.shift 方法用于移除數組中的第一個元素,并返回該元素。為了更好地理解這個方法的內部機制,我們將從零開始實現一個自定義的 shift 方法,并逐步解析其實現步驟。

          手搓 shift 方法

          shift 方法會移除數組中的第一個元素,并返回該元素。以下是我們自定義實現的 shift 方法的代碼:

          Array.prototype.myShift = function() {
          // 檢查數組是否為 null 或 undefined
          if (this == null) {
            throw new TypeError('Array.prototype.myShift called on null or undefined');
          }
          
          const O = Object(this);
          const len = O.length >>> 0;
          
          // 如果數組為空,返回 undefined
          if (len === 0) {
            O.length = 0;
            return undefined;
          }
          
          // 保存第一個元素
          const firstElement = O[0];
          
          // 將數組元素左移
          for (let k = 1; k < len; k++) {
            O[k - 1] = O[k];
          }
          
          // 刪除數組最后一個元素
          delete O[len - 1];
          O.length = len - 1;
          
          // 返回第一個元素
          return firstElement;
          };
          

          解析實現步驟

          1. 檢查數組是否為 nullundefined

          確保 this 不為空:

          if (this == null) {
            throw new TypeError('Array.prototype.myShift called on null or undefined');
          }
          

          2. 將 this 轉換為對象,并獲取數組長度

          this 轉換為對象并獲取數組長度:

          const O = Object(this);
          const len = O.length >>> 0;
          

          3. 處理空數組的情況

          如果數組為空,返回 undefined 并將數組長度設為 0:

          if (len === 0) {
            O.length = 0;
            return undefined;
          }
          

          4. 保存第一個元素

          將第一個元素保存到 firstElement 變量中:

          const firstElement = O[0];
          

          5. 將數組元素左移

          使用 for 循環將數組元素左移:

          for (let k = 1; k < len; k++) {
            O[k - 1] = O[k];
          }
          

          6. 刪除數組最后一個元素

          刪除數組的最后一個元素并更新數組長度:

          delete O[len - 1];
          O.length = len - 1;
          

          7. 返回第一個元素

          返回保存的第一個元素:

          return firstElement;
          

          實用小技巧:移除數組中的第一個對象

          你可以使用 shift 方法輕松地移除數組中的第一個對象。例如,移除數組中的第一個對象元素:

          const objects = [{ id: 1 }, { id: 2 }, { id: 3 }];
          const firstObject = objects.myShift();
          console.log(firstObject); // 輸出 { id: 1 }
          console.log(objects); // 輸出 [{ id: 2 }, { id: 3 }]
          

          通過這種方式,我們可以移除數組中的第一個對象元素,簡化對象處理過程。

          最后

          通過實現自定義的 shift 方法,我們深入理解了 JavaScript 中數組的操作方式。相信你也可以更好地掌握 shift 方法的內部機制,并提升你的 JavaScript 編程技巧。如果你有任何問題或建議,歡迎在評論區留言交流!祝你編程愉快!

          試左移是什么

          傳統的測試左移

          簡單說,左移軟件測試就是將開發周期看作從左到右的一條直線。在舊模式中,測試僅在這條直線的最右邊發揮作用。認識到這一瓶頸,我們現在希望將測試的開始位置盡量左移。左移是在軟件交付過程中盡早發現和防止缺陷的一種實踐方法,目的是盡量在軟件開發生命周期中盡早將測試任務左移,以提高產品質量。左移測試意味著在軟件開發過程的早期階段進行測試。

          測試左移的優缺點

          測試左移理論上的優點:

          • 成本本身就是將測試左移的主要動機之一,據估算,超過一半的軟件缺陷可以在需求挖掘階段被發現,只有不到10%的缺陷出現在生命周期的開發階段,在產品投入生產后消除缺陷的成本將是需求挖掘階段的100倍以上
          • 更高的自動化效率,左移可以提高自動測試的能力。測試自動化的主要好處包括:顯著減少人為錯誤、擴展測試范圍(可以同時進行多個測試)、測試人員能夠專注于更有趣、更有意義的任務、減少生產問題
          • 更快的軟件交付效率越早發現缺陷、越能快速修復它們。如果您能在生產周期的早期發現缺陷,便可以更快地修復它們。從而:大大縮短兩次產品發布之間的時間間隔,提高軟件質量

          測試左移理論上的缺點:

          • 極高的測試基建要求,測試左移對代碼掃描、質量度量、接口用例自動化、完善的測試用例、數據工廠、測試環境等都有較高要求,需要在具有一定基建能力下才能完善測試左移
          • 很多團隊所處的生命周期不適用,對于初創團隊、創新團隊、快速迭代團隊等團隊不一定適用于測試左移,上述團隊在絕大部分
          • 容忍度較高的互聯網行業,對于部分用戶體感不通的互聯網業務,用戶能夠容忍小的問題上線,只要快速修復即可,該業務有時候大家更加看重的是快速發現問題,而不是在線下做到盡善盡美

          云音樂測試左移的痛點


          開發以為:
          * 測試左移完全是工作的轉移,變成了純是開發做測試
          測試以為:
          * 測試左移,工作全是開發的,但是出問題測試也都要擔責

          當我們討論這個痛點之前,我們一定繞不過去的一個問題就是:開發測試比 ,目前的測試左移是我們主動選擇的結果還是被動選擇的結果

          結論:以目前云音樂的開發測試比,我們很難完全支持所有業務,此處涉及組織敏感數據,細節不在此處展開

          行業內會是什么樣

          局部的測試左移:

          • 極致服務端錄制回放 https://help.aliyun.com/document_detail/62635.html
          • 導購、交易特色錄制回放方案
          • 封版模式,服務端開發自測,同時通過客戶端測試兜底

          我期望的測試左移是什么


          理想的測試左移:
          事前

          • 技術方案評審
          • 核心p0、p1的接口自動化
          • 場景自動化錄制回放
          • 特定場景的UI自動化

          事中

          • 中心化的客戶端卡口(crash、輿情中心化卡口、高危組件識別兜底、包產物檢查等)
          • P0場景回歸兜底(約1000個測試用例)
          • P1場景回歸兜底(約3000個測試用例)
          • 核心財報埋點卡口兜底

          事后

          • 強大的染色能力,重點項目的上線,相關功能逐步灰度上線,灰度的功能能夠全量隔離并單獨監控,比如針對改動功能用戶的輿情、crash等能單獨識別
          • 強大的中心化crash、輿情、slo監控處理群
          • 資損監控

          通過事前、事中、事后的方式,顯著的提升確定性、提高質量,同時也能減少測試左移,研發的體感,避免工作量的轉移

          測試用例自動化的完善

          進一步的覆蓋率提升

          測試左移一定需要具有強大的自動化用例,通過穩定、準確、覆蓋率高的自動化測試用例提高整體線下質量。這里涉及到服務端測試用例與客戶端測試用例,目前根據業界自動化成熟度在服務端自動化要求會更加高,需要涉及絕大部分場景,客戶端這塊主要用于穩定性自動化與核心用例回歸兜底

          服務端自動化提升

          目前從行業內技術發展看,服務端的自動化技術已經較成熟,不管是接口測試還是引流自動化,服務端自動化具有幾個優點

          • 穩定性高,在接口不大規模改動的前提下,服務端自動化在執行過程中有較高的成功率
          • 成本相對較低,接口自動化主要是rpc接口的請求以及返回值的教研,通過gotest等接口測試平臺,編寫服務端自動化的成本相對較低,通過引流回放的成本更低
          • 較好管理,服務端接口的用例基本以研發接口為主,整體用例場景較好管理

          首先是服務端測試用例的提升,平臺這塊主要希望服用gotest接口測試平臺,核心2個關鍵次:穩定、覆蓋率高

          • 針對穩定,周維度跟進,連續兩周穩定性不達標,@對應質量組長跟進,并提醒改進
          • 針對覆蓋率,中心化度量覆蓋率,通過分析ox平臺和goapi平臺的接口數,并將各業務存量接口未導入goAPI的集中導入

          最終期望 3分:服務端線下接口覆蓋率達到95%,CI用例通過率95%;代碼覆蓋率:50% 5分:服務端線下接口覆蓋率達到99%,CI用例通過率99%;代碼覆蓋率:60%;

          服務端自動化長遠方案:加強引流平臺的建設,通過線上流量錄制回放,并做好線上流量的用例、場景管理,進一步減少自動化用例成本

          客戶端自動化提升

          目前從行業內技術發展看,客戶端的自動化技術相對還需要突破,行業內經常聽說某團隊維護幾萬的服務端自動化腳本,但是很少聽說某團隊維護超過1000以上的客戶端腳本,客戶端自動化具有以下特點:

          • 具有明顯的中心化特征,不管是什么團隊,最終客戶端代碼的實現都是通過中心化發版來上線,因此非常適合集中做monkey、內存泄漏等中心化穩定性操作
          • 自動化穩定性相對不高,維護成本相對較高,因為前端UI界面變化較塊,客戶端腳本成功率普遍顯著低于服務端

          客戶端中短期方案:

          • 中心化的monkey、內存泄漏測試,通過中心化運作,通過monkey、內存泄漏等方案,集中發現問題
          • 中心化的P0測試用例回歸,測試用例不追求大而全,保障核心場景自動化沒問題 長期方案:目前行業內針對瀑布流、自定義動態生成有較好的客戶端成功率

          瀑布流場景:

          瀑布流場景用戶操作簡單,核心功能主要為上滑與下滑,自動化運行簡單,可以通過UI自動化執行上滑下滑,然后通過截圖,圖像對比進行校驗,成功率較高,即使是千人千面也可以通過mock規避相關個性化問題,因此后續涉及瀑布流場景建議UI自動化突破

          自定義動態生成場景:

          自定義動態下發場景,客戶端最終的界面是通過服務端約定協議自動生成的,因此只要和客戶端引擎、協議打通,最終的界面是確定的,UI自動化可以針對協議編寫自動化腳本,穩定性方面可以極大的規避之前UI界面變動導致的成功率較低的問題

          強大的客戶端卡口能力

          客戶端是絕大部分功能上線交付消費者的中心節點,集中做好客戶端的功能保障,在很大程度上能形成中心化的兜底,規避較多的重大問題。因此云音樂主要在測試用例三層兜底、版本流程發布管控上做了較大投入

          版本發布三層兜底

          云音樂客戶端版本版本發布設定三層兜底,首先是P00用例,只出為最核心的關鍵用例集,只要在涉及到發布,包產物有變動,都需要執行一次關鍵核心用例集

          然后是P0用例,大概1000條左右,按照正常凍結集成時間,一天內執行完,主要包含日常回歸的主要用例,每個模塊的主流程

          最后是P1用例,大概3000條左右,主要包含每個模塊其他額外的分支場景,該用例需要執行3天,且不需要考慮用戶有修改代碼,每次只執行一次

          通過三層兜底,我們客戶端實現了核心功能只要改動都做好了回歸,分之場景一定周期也能做到全量回歸,通過分級做到了成本與回歸面的統一




          版本流程優化

          通過版本發布的checklist流程化,保障每次包的發出,不會出現較大的問題,讓每次包產物的變化得到性能、功能、埋點、穩定性等方面的驗證

          強大的監控能力

          當前面所有的測試、兜底都完成后,還是會有問題泄漏,因此我們也需要有良好的問題發現能力,避免質量顯著下降

          事前-監控設計

          我們希望重點項目上線前默認都是有監控的,帶著監控上線的功能才更加具有確定性

          服務端系統需要關注:

          • GoAPI巡檢監控
          • SLO監控
          • pylon 埋點監控
          • 哨兵監控
          • Nydus監控 / Kafka監控
          • NDC監控
          • 輿情監控

          前端監控需要關注:

          • Corona監控
          • 輿情監控
          • H5巡檢監控
          • RN巡檢監控

          同時發布要分批次,并做好分批次監控觀察

          事中-重點項目染色

          1、重點項目-關聯標記(項目自定義標記,自定義流量標記x-proj-tag)

          2、服務端鏈路監控告警區分:大前端請求API透傳標記+網關請求流量打標+腳手架中間件透傳標記+應用日志監控SDK上報流量標記+監控平臺通過流量標記區分監控告警內容

          3、客戶端監控告警區分:大前端日志異常和崩潰上報帶上業務自定義標記

          事后-中心化監控處理

          監控的效果需要可被觀測,因此分級的重要的報警都會被集中到中心化群里被所有人觀測,提高處理者處理的壓力和動力

          結語

          以上就是我對測試左移的一些理解,也包含了挺多測試右移的思想。主要適用于風險適中的業務,對涉及資金類、電商核心流程等需要謹慎看待

          作者:陽際榮(韓鍔)

          來源:微信公眾號:網易云音樂技術團隊

          出處:https://mp.weixin.qq.com/s/RApeHXYpmm1nPVLW1Y0ahw


          主站蜘蛛池模板: 一区二区三区美女视频| 一区二区三区四区视频| 日韩免费观看一区| 久久无码一区二区三区少妇| 成人精品视频一区二区三区不卡| 国产成人久久精品一区二区三区 | 国产综合精品一区二区三区| 91在线视频一区| 国产内射在线激情一区| 伊人色综合视频一区二区三区| 国产精品一区在线观看你懂的| 国产免费一区二区三区| 99精品一区二区免费视频 | 一区二区三区四区精品视频| 欲色aV无码一区二区人妻| 亚洲中文字幕丝袜制服一区| 色一情一乱一伦一区二区三欧美 | 国产天堂在线一区二区三区| 国产伦精品一区二区三区| 国产亚洲一区二区三区在线不卡| 国产乱码精品一区二区三区四川人| 波多野结衣高清一区二区三区 | 日韩伦理一区二区| 日韩综合无码一区二区| 国产精华液一区二区区别大吗| 国产精品成人免费一区二区 | 亚洲丶国产丶欧美一区二区三区| 亚洲一区二区三区免费| 国产一区美女视频| 在线播放精品一区二区啪视频| 97久久精品无码一区二区天美 | 无码av免费一区二区三区| 国产一区二区精品尤物| 国产午夜精品一区二区| 国产日韩高清一区二区三区| 国产精品无码一区二区在线观一 | 日本精品一区二区三区在线视频| 北岛玲在线一区二区| 农村乱人伦一区二区| 精品无码人妻一区二区三区不卡| 亚洲AV福利天堂一区二区三|