編者按:本文是霍格沃茲測試學院優秀學員 @TM20N 的分享,從“被歧視”的資深外包人員到“被認可”的 BAT 大廠測試開發,他的技術成長、心路歷程和職業發展忠告值得每位外包同學學習!
測試職業生涯
深陷外包測試的困境
在測試行業工作有 5 年多了,之前一直是在大廠做外包測試工作。外包測試的工作特點就是:一直跟業務深度綁定,在技術成長方面則提升緩慢。到了后期,就感覺總是在做重復的點點點工作,但無論業務還是個人職業發展都遇到瓶頸,無法突破。
其實本來計劃在 2020 過完年就換一份工作的,但由于遇到疫情影響,跳槽計劃就被耽擱了一段時間。在年中疫情開始有所緩解之后,就開始默默的投了一波簡歷。但基本上都是石沉大海,面試邀約寥寥無幾,這時候才清醒的認識到殘酷生活的真實面貌 —— 憑借自己目前的工作經歷和測試技能,出去找到更好的工作真的很難:
- 一方面,現在好一點的公司招測試,技能要求基本都是測試開發,自己技術實力還有很大差距;
- 另一方面,好一點的職位,大廠更優先看重內推的人,面試成功率比海投更高,而我正缺乏這樣的行業人脈;
幸運的是,這個時候看到了霍格沃茲測試學院的《Java 中高級測試開發名企定向培養計劃》介紹信息,當時看到課程內容信息一下子就吸引了我,另外還有內推 BAT 名企服務也讓我心花怒放。簡單咨詢之后,就毫不猶豫的報了名。
學院課程果然沒有讓我失望,有深度有廣度,涵蓋了大廠最主流的測試開發技術體系,內容豐富系統并且理論與實戰相結合。有很多之前聞所未聞的知識,讓我視野開闊并重新找到了學習的樂趣。
我最想分享的個人學習經驗:一定要跟著視頻練習,光看是沒用的,自己動手做一遍才能知道哪里有坑,只有解決了問題才能真正內化為自己的知識。雖然整個過程很有挑戰性,甚至是處于磕磕絆絆的狀態,但還好我一直堅持學完了整個課程。
上課會記錄電子筆記
從“被歧視”到“被認可”
在學習完霍格沃茲的全部課程之后,就開始尋求新的面試機會,學院也幫忙匹配內推合適的公司崗位。
雖然我的測試技術水平提升很大,整個人也自信了很多,但說實話,“外包測試”這個標簽在面試時或多或少都會面試官被歧視,甚至是不公正待遇,尤其是一些小公司。我能真切的感到面試官看到是外包測試背景,態度上會有一些細微的轉變,有的還會故意刁難。這也深深的刺痛了我,感覺自己的職業生涯都被外包耽誤了。
所以,在這奉勸大家一句:沒有技術含量的外包測試真的能不去就不要去了,不得不去也不要做太久,盡快辭職,找更好的工作提升自己是正道!
再后來,又陸續面試了幾家大廠,靠著在學院學到的測試開發實戰技能,最終成功拿下某互聯網大廠測試開發崗位 Offer,薪資漲幅 70%,也實現測試職業生涯質的飛躍。
下面分享一下大廠面試中的一些印象深刻的高頻題目,以及我個人的解答,僅供大家參考。
大廠測試開發面試真題
業務基礎相關
- 自我介紹
- 測試流程
- 項目介紹(結合自己的項目講清楚是做什么的)
- 入職后如何開展工作
- 在測試項目中開發的提效工具
算法題
- 計算相同字符個數,并按個數排序,返回前 k 個(多家大廠的高頻題目)
<pre style="margin: 10px 0px; padding: 0px; max-width: 100%; color: rgb(63, 63, 63); font-size: 14px; font-style: normal; font-weight: normal; letter-spacing: 0.476px; text-align: left; text-indent: 0px; text-transform: none; widows: 2; background-color: rgb(255, 255, 255); border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box; overflow-wrap: break-word;">`public static List sort(String arrs[], int k){
Map<String, Integer> map = new HashMap<>();
for (String arr : arrs) {
map.put(arr, map.getOrDefault(map.get(arr), 1) + 1);
}
List<Map.Entry<String, Integer>> lists = new ArrayList<>(map.entrySet());
//按map的value排序
Collections.sort(lists, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
List<String> list = new ArrayList<>();
if (k > lists.size()){
return list;
}
for (int i = 0 ; i < k ; i++){
list.add("(" + lists.get(i).getKey() + "," + lists.get(i).getValue() + ")");
}
return list;
}` </pre>
- 返回 s2 在 s1 中的位置,要求不能使用 indexOf,并且輸入任何字符串都能返回位置,如果沒有,返回 0;
<pre style="margin: 10px 0px; padding: 0px; max-width: 100%; color: rgb(63, 63, 63); font-size: 14px; font-style: normal; font-weight: normal; letter-spacing: 0.476px; text-align: left; text-indent: 0px; text-transform: none; widows: 2; background-color: rgb(255, 255, 255); border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box; overflow-wrap: break-word;">`public static void main(String[] args) {
String s1 = "www.taobao.com";
String s2 = "taobao";
Integer index = getPosition(s1, s2);
System.out.println(index);
}
public static Integer getPosition(String s1, String s2){
int n = 0 ;
if (s1.isEmpty() || s2.isEmpty()){
return n;
}
int l1 = s1.length();
int l2 = s2.length();
for(int i = 0; i < l1 - l2 + 1; i++){
String str = s1.substring(i, l2 + i) ;
if(str.equals(s2)){
return i;
}
}
return n;
}` </pre>
Java 相關題目
- 線程和進程的區別:
- 一個進程可以包含多個線程
- 線程是在進程的基礎上創建并使用,所以線程依賴進程
- 不同進程間數據很難共享,同一進程下不同線程間數據很易共享
- 進程要比線程消耗更多的計算機資源
- 線程啟動速度比進程快很多,使用多線程進行并發處理的時候,執行效率要高于進程
- List、Set、Map 區別:
- List集合允許有重復數據,保存順序即其存儲順序
- set保存的順序是無序的,且不能保存重復元素
- map已key-value形式進行存在,為無序存儲,key,value可為null,key不可重復
- ArrayList 和 LinkedList 區別:
- ArrayList 是數組實現的集合操作,LinkedList 是鏈表實現的集合操作;
- 在使用 List 集合中的 get() 方法根據索引獲取數據時,ArrayList 的時間復雜度為 O(1)”,而 LinkedList 的時間復雜度為 O(n);
- LinkedList 沒有提供初始化大??;ArrayList 使用時默認初始化大小長度為 10,在空間不足時,已 2 倍的形式進行擴容,如果保存大數據量的時候,會有垃圾的產生和性能的下降,這個時候可以使用 LinkedList 子類保存;
- Overloading 和 Override區別:
|
No.
|
區別
|
Overloading
|
Override
|
|
1
|
中文含義
|
重載
|
覆寫
|
|
2
|
概念
|
方法名稱相同,參數類型和個數不同
|
方法名稱、參數的類型及個數、返回值相同
|
|
3
|
權限
|
沒有權限限制
|
被覆寫的方法不能擁有更嚴格的控制權限
|
|
4
|
范圍
|
發生在一個類中
|
發生在繼承關系類中
|
- 抽象類和接口區別:
|
No
|
區別
|
抽象類
|
接口
|
|
1
|
定義
|
abstract class 接口類名稱{}
|
Interface 接口名稱{}
|
|
2
|
組成
|
構造、普通方法、靜態方法、全局常量、普通成員、static方法
|
抽象方法、全局常量、普通方法、static方法
|
|
3
|
權限
|
可以使用各種權限
|
只能使用public
|
|
4
|
子類使用
|
子類通過extends可以繼承一個抽象類
|
子類使用implements可以實現多個接口
|
|
5
|
兩者關系
|
抽象類可以實現若干個接口
|
接口不允許繼承抽象類,但是允許繼承多個父接口
|
|
6
|
使用
|
抽象類或接口必須定義子類;
子類一定要覆寫抽象類或接口中的全部抽象方法;
通過子類的向上轉型實現抽象類或接口對象實例化;
|
- Spring boot 常用注解:
- @RestController
- @RequestMapping("")
- @GetMapping("")
- @PostMapping("")
- @Autowired
- @Service
- @RequestParam
- @RequestBody
- 手寫 Spring 實現過程
- 數據庫:
- 增、刪、改、查、連表查詢
- 基礎必須要會(緩存、索引了解的不多,沒答上來)
- 查詢每門課程成績都大于60分學生(使用一條語句)
<pre style="margin: 10px 0px; padding: 0px; max-width: 100%; color: rgb(63, 63, 63); font-size: 14px; font-style: normal; font-weight: normal; letter-spacing: 0.476px; text-align: left; text-indent: 0px; text-transform: none; widows: 2; background-color: rgb(255, 255, 255); border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box; overflow-wrap: break-word;">select name from 表 group by name having min(成績)>=60
</pre>
Liunx 相關
- 三劍客:grep(最常考)、awk、sed(這里不列舉了)
Selenium 相關
- 元素的定位方法
- id、name、xpath
PageObject 封裝的思想
- 只封裝重要功能
- 封裝細節,只對外提供方法
- 操作細節與斷言不要混用
什么樣的項目適合做 UI 自動化測試?
- 項目穩定,不會頻繁變更
- 定期構建,比較頻繁的回歸驗證
- UI 界面穩定,變動少
- 項目進度壓力不大,維護周期長
總結
最后,真的非常感謝霍格沃茲測試學院,為我們提供了一套完整的測試開發技術體系精品課程,也感謝各位老師的講解和答疑,也祝各位同學能夠學有所成。祝大家在新的一年,所求皆所愿,所行化坦途!
(文章來源于霍格沃茲測試學院)
更多技術文章可點擊http://qrcode.testing-studio.com/f?from=jianshu&url=https://ceshiren.com/t/topic/3822