软件测试技术栈01
大廠軟件測試崗經驗分享
通過大數據總結發現,其實軟件測試崗的面試都是差不多的。常問的有下面這幾塊知識點:
全網首發-涵蓋16個技術棧
第一部分,測試理論(測試基礎+需求分析+測試模型+測試計劃+測試策略+測試案例等等)
第二部分,Linux( Linux基礎+Linux練習題)
第三部分,MySQL(基礎知識+查詢練習+萬年學生表經典面試題匯總+數據庫企業真題)
第四部分,Web測試
第五部分,API測試
第六部分,App測試
第七部分,管理工具
第八部分,Python基礎(Python基礎+編程題+集合+函數+Python特性等等)
第九部分,Selenium相關
第十部分,性能測試
第十一部分,LordRunner相關
第十二部分,計算機網絡
第十三部分,組成原理
第十四部分,數據結構與算法
第十五部分,邏輯題
第十六部分,人力資源
1.軟件測試基礎
軟件測試的步驟是什么?
如何錄制測試腳本?
應該考慮進行如何測試的測試方法
怎樣估計測試工作量?
測試設計的問題
當測試過程發生錯誤時,有哪幾種解決辦法?
測試執行的問題
測試評估的目標
如何提高測試?
C/S模式的優點和缺點
B/S模式的優點和缺點
2.Linux
grep和find的區別? grep 都有哪些用法?
查看IP地址?
創建和刪除一個多級目錄?
在當前用戶家目錄中查找haha.txt文件?
如何查詢出tomcat的進程并殺掉這個進程,寫出linux命令?
動態查看日志文件?
查看系統硬盤空間的命令?
查看當前機器listen 的所有端口?
3.Python
統計python源代碼文件中代碼行數,去除注釋,空行,進行輸出?
python調用cmd并返回結果?
冒泡排序
1,2,3,4 這4個數字,能組成多少個互不相同的且無重復的三位數,都是多少?
請用 python 打印出 10000 以內的對稱數(對稱數特點:數字左右對稱,如:1,2,11,121,1221 等)
給定一個整數 N,和一個 0-9 的數 K,要求返回 0-N 中數字 K 出現的次數
判斷 101-200 之間有多少個素數,并輸出所有的素數
一個輸入三角形的函數,輸入后輸出是否能組成三角形,三角形類型,請用等價類- 劃分法設計測試用例
4.MySQL
你用的Mysql是哪個引擎,各引擎之間有什么區別?
如何對查詢命令進行優化?
數據庫的優化?
Sql注入是如何產“生的,如何防止?
NoSQL和關系數據庫的區別?
MySQL與MongoDB本質之間最基本的差別是什么
Mysql數據庫中怎么實現分頁?
Mysql數據庫的操作?
優化數據庫?提高數據庫的性能?
什么是數據的完整性?
5.Web
Web測試和app測試區別?
WEB測試環境搭建和測試方法
WEB測試教程
WEB測試要點及基本方法
Web測試頁面總結
6.接口測試
什么是接口
如果模塊請求http改為了https,測試方案應該如何制定,修改?
常用HTTP 協議調試代理I具有什么?詳細說明抓取HTTPS協議的設置過程?
描述TCP/IP協議的層次結構,以及每一-層中重要協議
jmeter,一個接口的響應結果如下:
接口產生的垃圾數據如何清理
依賴第三方的接口如何處理
測試的數據你放在哪?
什么是數據驅動,如何參數化?
7.性能測試
你認為性能測試的目的是什么?做好性能測試的工作的關鍵是什么?
服務端性能分析都從哪些角度來進行?
如何理解壓力測試,負裁測試以及性能測試?
如何判斷是否有內存泄漏及關注的指標?
描述軟件產“生內存泄露的原因以及檢查方式。(可以結合- 種開發語言進行描述)
簡述什么是值傳遞,什么是地址傳遞,兩者區別是什么?
什么是系統瓶頸?
8.selenium
如何開展自動化測試框架的構建?
如何設計自動化測試用例:
webdriver如何開啟和退出一個瀏覽器?
什么是自動化測試框架?
Selenium是什么,流行的版本有哪些?
你如何從命令行啟動Selenium RC?
在我的機器端口4444不是免費的。我怎樣才能使用另一個端口?
什么是Selenium Server,它與Selenium Hub有什么不同?
你如何從Selenium連接到數據庫?
你如何驗證多個頁面上存在的一個對象?
XPath中使用單斜杠和雙斜杠有什么區別?
如何編寫SeleniumIDE/ RC的用戶擴展?
如何在頁面加載成功后驗證元素的存在?
你對Selenium Grid有什么了解?它提供了什么功能?
如何從你的Java Class啟動Selenium服務器?
Selenium中有哪些驗證點?
什么是XPath?什么時候應該在Selenium中使用XPath?
9.計算機與網絡
一臺計算機的IP是192.168.10.71子網掩碼255.255.255.64與192.168.10.201 …
請簡述DNS、活動目錄、域的概念。
10M兆寬帶是什么意思?理論下載速度是多少?
什么是IP地址?
OSI七層網絡模型的劃分?
TCP和UDP有什么不同?
HTTP屬于哪一層的協議?
HTTP和HTTPS的區別?
cookies和session的區別?
HTTP的get請求和post請求的區別?
HTTP1.0和HTTP1.1有什么區別
TCP的連接建立過程,以及斷開過程?
客戶端使用DHCP獲取IP的過程?
寫出某個網段的網絡地址和廣播地址?
10.人力資源
你的測試職業發展是什么?你自認為做測試的優勢在哪里?
你找工作時,最重要的考慮因素為何?
為什么我們應該錄取你?
請談談你個人的最大特色。
一個測試工程師應具備那些素質和技能?
還有問一下你是怎樣保證軟件質量的,也就是說你覺得怎樣才能最大限度地保證軟件質量?
為什么選擇測試這行?
如果我雇用你,你能給部門帶來什么貢獻?
字節跳動(抖音)軟件測試月薪23K崗、技術二面面試題最新出爐
測試人員在測試中的任務是什么?
- ① 盡可能早地找出系統中的bug;
- ② 避免軟件開發過程中缺陷的出現;
- ③ 協助開發定位bug.以及后續bug跟蹤
- ④ 一切以用戶的需求為標準,確保軟件的質量
HTTP與HTTPS協議的區別?
- http協議又叫做超文本傳輸協議,在做網絡請求的時候,我們基本上是使用http協議。
- 請求方式包括get請求和post請求。
測試用例評審的流程是什么?
- 目的:主要是為了展開測試用例評審工作提供指引,規范測試用例管理工作。
- 流程:
測試用例是否按照公司定義的模板進行編寫的;
測試用例的本身的描述是否清晰,是否存在異議性;
測試用例內容是否正確,是否與需求目標相一致;
測試用例的期望結果是否確定、唯一的;
操作步驟應與描述是否相一致;
測試用例是否覆蓋了所有的需求;
測試設計是否存在冗余性;用例是否可執行
是否從用戶層面來設計用戶使用場景和業務流程的測試用例;
場景測試用例是否覆蓋負載的業務流程;
用例設計是否包含了正面、反面的用例;
由系統自動生成的輸出項是否注明了生成規則;
用例應包含對中間和后臺數據的檢查;
測試用例應有正確的名稱和編號;
測試用例應標注有執行的優先級;
測試用例包含相關的配置信息:測試環境、數據、前置測試用例、用戶授權等;
每個測試用例步驟應<=15 step;
自動化測試腳本必須帶有注釋(注釋應包括:目的、輸入、期望結果等);
非功能測試需求或不可測試需求是否在用例中列出并說明。
缺陷報告內容包括什么?
- 和bug產生對應的軟件版本;
- 開發的接口人員;
- bug的優先級;
- bug的嚴重程度;
- bug可能屬于的模塊,如果不能確定,可以找開發人員來判斷;
- bug標題,需要清晰地描述現象;
- bug描述,需要盡量給出bug的步驟;
- bug附件中能給出相關的日志和截圖。
用monkey做app測試,怎么做的?
- 先使用 adb logcat -c 清空手機的logcat日志;
- 接下來使用 adb logcat -v time 獲取logcat 日志,并導入本地文件使用 monkey 運行被測應用 adb shell monkey -p 報名 -v
- 100000 并將執行結果導入到本地測試;
- 如果中途失敗了就要去看monkey日志中有沒有crash或者anr的關鍵字;
- 如果還需要定位到是什么原因導致的anr或者crash的問題,將相關日志和logcat日志與進程號提交給開發定位;
- 如果是anr的問題,還需要從安卓中獲取/data/anr/traces.txt文件提交給開發定位
app出現CRASH的原因?
- 空指針值,數組越界,內存不足,CPU滿負荷(現在手機基本都是8核CPU,基本不會出現CPU滿負荷的情況)
jmeter為什么要參數化?
- 做壓力測試時,我們經常需要替換參數,在jmeter中,有多種參數化的形式。可以在測試計劃中設置全局參數,可以設置用戶參數,還可以在前置處理器中設置用戶參數。在進行多線程并發的時候,如果需要多個參數,可以使用csv配置元件。
- 比如做登錄操作,后臺有可能會限制一個用戶不能重復登錄多次,如果演示登錄的并發操作,可以使用jmeter中的csv軟件,將用戶信息導出來,放到文件中,就可以讓線程共享這些數據。
- 另外,對于一些隨機變化的參數,可以使用jmeter中的函數助手,生成隨機函數,進行參數化測試。比如注冊這樣的操作,用戶名要求唯一的,那就可以使用隨機函數模擬出來。
App測試與web測試的區別?
相同點:
- 同樣的測試用例設計方法;
- 同樣的測試方法:都會依據原型圖來檢查UI;
- 測試頁面載入和翻頁的速度、登錄時長、內存是否溢出等;
- 測試應用系統的穩定性。
不同點:
- App的中斷測試:來電中斷、短信中斷、藍牙中斷、鬧鐘等;
- App的安裝卸載:全部安裝、升級安裝、第三方工具安裝卸載、消息推送、前后臺切換、網絡環境等;
- 兼容性測試:web項目考慮不同瀏覽器兼容,App考慮不同操作系統、不同機型、不同屏幕等;
- 網絡測試:不同網絡與運營商,不同的網絡制式,如GSM,CDMA,3G等,在不好或無網絡的情況下的app行為;2G 3G 4G 5G wifi
- web自動化測試工具較常用selenium,而手機自動化monkey、appium;
- App測試平臺:百度云測
MySQL數據庫查詢語言有哪些?會多表聯查嗎?
數據庫語言最常用的是SQL
多表聯查:select * from table1 t1,table2 t2 where tl.id=t2.id
這樣就是多表聯查。
- left join
- right join
- inner join
Linux系統操作的指令說一下:
- 增加,刪除,復制,移動等問題?
- cd:進入目錄
- cd app:切換到app目錄
- cd… :切換到上一層目錄
- cd/: 切換到系統根目錄
- tail -10 a.txt :查看后10行數據
- ifconfig :查看ip
- ll:查看文件及其屬性
- vi: 編輯
- rm-rf: 刪除
- car:解壓及壓縮命令
- cp:復制
- pwd:顯示當前路徑
- mv:移動
- cat:查看文件內容
- touch:創建文件
- tail logcat:查看日志
- cat logcat:查看日志
- tomcat:日志
- tail :查看日志記錄信息,tail -f catinalia out
- tar -xvf 文件名 :解壓
- tar -n logcat 查看系統日志
- tar -zcvf 文件名:壓縮
三面京東:
一面:
你所了解的黑盒測試方法有哪些?并簡單介紹下其應用場景?
簡述常用的bug管理或者用例管理工具,并且描述其中的一個工作流程?
什么是正交實驗法,使用場景是什么?
請簡單描述測試工具loadrunner、selenium、QTP的產品用途,并介紹你在項目中實際用到的功能模塊?
簡述selenium grid的作用?
高質量的自動化腳本應該具備哪些特性?
編寫測試計劃文檔的目的是什么?測試計劃文檔的內容主要包括哪些?
并簡單介紹其作用?
25k成功入職京東:拿到京東軟件測試崗位offer經驗分享
二面:
項目某一輪系統測試完成后,達到系統測試結束的參考指標或規則通常有哪些?
Unix/Linux查看所有屬于java進程的命令是?并將其批處理殺掉?
java中sleep()和wait()的區別?抽象類和接口的主要區別是?
QTP中的RO和TO的區別?談談你生成某業務功能模塊的QTP腳本具體操作步驟?
關于selenium中,查找某個頁面元素的常見方法有哪幾種?對于窗體和頁面框架:frame切換用什么方法?
RobotFramework框架中設置變量有幾種方式?
RobotFramework框架中調用各種cmd命令,用什么關鍵字?
寫出你常用的測試工具有哪些?
介紹下你所經歷的開發-測試-代碼上線的整個相關流程?并簡單描述下此流程.
25k成功入職京東:拿到京東軟件測試崗位offer經驗分享
三面
刪除文件用哪個命令?如果需要連目錄及目錄下文件一塊刪除呢?刪除空文件夾用什么命令?
Linux 下命令有哪幾種可使用的通配符?分別代表什么含義?
用什么命令對一個文件的內容進行統計?(行號、單詞數、字節數)
Grep 命令有什么用? 如何忽略大小寫? 如何查找不含該串的行?
Linux 中進程有哪幾種狀態?在 ps 顯示出來的信息中,分別用什么符號表示的?
怎么使一個命令在后臺運行?
利用 ps 怎么顯示所有的進程? 怎么利用 ps 查看指定進程的信息?
哪個命令專門用來查看后臺任務?
25k成功入職京東:拿到京東軟件測試崗位offer經驗分享
HR面
負責什么系統
為什么要讓我獨立負責
手頭有沒有其他offer
offer薪資有多少
哪里人 以后打算在哪里發展 是否接受入職前實習
是否接受996(然后后來才知道我們部門并不是996)
面試總結:
面試盡量提前到,能早點面試,面試官也更愿意給你通過(就像中國好聲音一樣,一開始都是瘋狂轉身)。面試時調動你的幽默細胞,盡量把面試氣氛調得愉快一點,這樣面試官能更深的記住你。
說自己優點的時候一定輔以證據,不然面試官只會當作耳邊風
不會的問題不要強答,小心有坑,可以這樣說:“不好意思這個問題我不會,但是如果讓我來設計我會…”
面試其實是一個雙向選擇,面試官在評估你的表現,同時由于面試官也代表公司,他的素質及提的問題也是你應該評估的方面,所以不要緊張。
使用幕布,在每次面試前將自己總結的知識過一遍。我幕布上寫了幾萬字的筆記,每次面試都拿出來看一遍,所以面試問到的基礎我基本都能應答入流。
測試開發需要的技術棧
接下來我們說一下做一個測試開發所需要掌握的技術。
1、測試基礎
首先作為一個測試開發,測試基礎是必備條件。
測試用例設計方法(等價類、邊界值等)是必須要會的
測試計劃和測試報告的編寫
測試工具的使用:
抓包工具:charles、fiddler
接口測試工具:postman、apipost、apifox、jmeter
用例編寫工具:xmind
bug管理工具:禪道、jira
接口管理工具:yapi
只想做功能測試的同學,只會這些技能就足夠了(標紅的都是重點)
2、計算機基礎
計算機基礎包含的就稍微多一點
數據結構與算法
時間/空間復雜度分析
數據結構(數組、字符串、隊列、棧、鏈表、集合、哈希表、數等)
算法(排序、查找、雙指針、分治、遞歸、回溯、貪心等)
計算機網絡
網絡分詞模型
網絡傳輸過程
IP、端口
Http/Https協議
UDP/TCP協議
App地址解析協議
網絡安全
DNS域名解析
操作系統
操作系統的組成
進程、線程
進程、線程間的通訊方式
進程調度算法
進程、線程同步方式
進程、線程狀態
死鎖
內存管理
局部性原理
mysql數據庫
基本概念
mysql搭建
sql命令編寫
約束
索引
事務
鎖機制
設計數據庫表
性能優化
Linux(基本命令、shell腳本)
Linux系統安裝
環境變量
常用命令
常用環境搭建
shell腳本編程
VIM的使用
文件管理
用戶管理
內存管理
磁盤管理
進程管理
網絡管理
服務管理
Linux內核
3、編程語言
編程語言有很多,很多同學不知道該怎么選擇,在這里我推薦java和python,首先都是最主流的語言,python相對于java來說更適合小白學習,學習成本較低且語法簡單,學習java推薦有語言基礎,且大部分服務端都是java編寫的,學習后對于服務端測試能力有較大提升。
java基礎
數據類型、流程控制、面向對象、數組、枚舉、抽象類、接口、集合類、常用類、泛型、注解、多線程、IO流、反射、異常處理
python基礎
python安裝、開發工具使用、變量、運算符和表達式、流程控制、基本數據結構、函數、面向對象編程、模塊、包、異常處理、文件操作、函數進階、正則表達式、數據庫編程、并發編程、網絡編程以及三方庫使用(requests、openpyxl、nose、faker、datafaker)
4、web框架
首先說一下java的框架所需要掌握的:
maven、spring、spring web、spring mvc、Mybatis、Mybatis plus
spring boot、spring Security
接下來是python的web框架:
Django、flask、FastAPI、Django REST framework
關于開發框架并不是了解就可以,而且可以根據框架來寫一些東西,需要明白框架的原理以及了解框架之間存在的聯系且學習java框架的時候不推薦開始就學springboot,建議循序漸進的從spring開始學習,沒有時間學習的也可以直接學習springboot。
5、開發知識
前面我們已經說過開發框架的學習,這里就不重新說了,接下來說一下關于中間件以及開發常用的一些工具。
git :因為在開發平臺或者寫自動化或者拉開發代碼做白盒測試時免不了從git上拉代碼,需要了解git的的工作區和代碼的提交、推送、拉取、回退、重置以及分支的操作、代碼合并、分支沖突的解決,還要區分git和github。
Redis緩存:現在Redis緩存已經成為各個公司必備的一個緩存中間件,首先需要了解什么是緩存,了解本地緩存和多級緩存以及Redis的分布式緩存,熟悉Redis的一些應用場景,會解決使用Redis時遇到的一些問題(緩存雪崩、緩存擊穿、緩存穿透等)。
RabbitMQ消息隊列:RabbitMQ消息隊列是一個流行的開源的消息隊列系統,不是必須掌握,但是也是需要了解,明白消息隊列的作用,會搭建RabbitMQ消息隊列集群,以及可以使用java操作RabbitMQ。
6、平臺開發
在學習完各種基礎以及框架和中間件之后可以自己手動搭建平臺,包括像監控平臺、接口自動化測試平臺、壓測平臺等,下面給大家列舉了testerhome的開源測試平臺,大家可以去看下。
點擊跳轉
7、持續學習
學習完上面的這些技術,大家就可以放心大膽的去找工作了,在這里希望大家都可以有一份滿意的工作,不過在進入公司之后還是要繼續提升自己的,給大家推薦一下學習的一些工具以及技術。
首先是前端,HTML、CSS、javaScript、vue,不需要學習太多的前端技術,熟悉下基礎的前端三件套,了解前端是如何向后端發送請求來做數據交互的一般就夠了。有時間的話可以學下 Vue ,是比較容易上手的主流前端開發框架,Vue + SpringBoot 還是很香的。
然后是后端,Redis高級操作、kafka、Nginx網關、Dobbo、微服務(spring cloud),學會如何使用中間件并不難,先能夠獨立使用,了解他們的應用場景;再用 Java 來操作中間件,和項目相結合。學習微服務時,建議先從 Dubbo 學起,對分布式、RPC、微服務有些基本的了解,再去食用 Spring Cloud 全家桶會更香。
最后是測試,可以學習性能測試、大數據測試、算法測試等,測試這方面就不多說了。
總之,再提升測試能力的同時也逐步提升自己的開發能力,
面試經歷分享
一、面試基礎題
1.簡述測試流程:
2.什么是軟件測試?軟件測試的目的與原則
3.問:軟件生存周期及其模型是什么?
4.什么是軟件質量?
5.自動化測試腳本開發的主要步驟:
6.目前主要的測試用例設計方法是什么?
7.常見的測試用例設計方法都有哪些?請分別以具體的例子來說明這些方法在測試用例設計工作中的應用
8.測試的策略有哪些?
9.單元測試的策略有哪些?
10.正交表測試用例設計方法的特點是什么?
11.軟件的安全性應從哪幾個方面去測試?
12.需求測試的注意事項有哪些?
13.問:你在測試中發現了一個 bug ,但是開發經理認為這不是一個 bug ,你應該怎樣解決。
14.問:給你一個網站,你如何測試?
15.問:一臺客戶端有三百個客戶與三百個客戶端有三百個客戶對服務器施壓,有什么區別? ?
16.軟件的安全性應從哪幾個方面 去測試?
17.軟件質量保證體系是什么 國家標準中與質量保證管理相關的幾個標準是什么? ? 他們的編號和全稱是什么? ?
18.測試人員在軟件開發過程中的任務是什么?
19.在您以往的工作中,一條軟件缺陷(或者叫 Bug)記錄都包含了哪些內容?如何提交高質量的軟件缺陷(Bug)記錄?
20.黑盒測試和白盒測試是軟件測試的兩種基本方法,請分別說明各自的優點和缺點!
二、測試實戰面試題
1.我現在有個程序,發現在Windows上運行的很慢,怎么判別是程序存在問題還是軟硬件系統存在問題
2.一個程序有n個變量采用邊界值分析可以產生幾個測試用例
3.請設計一個關于ATM自動取款機的測試用例。
4.如何測試一個 紙杯?
5.我手上這支筆,請你根據這支筆設計測試用例
6.測試手機開機鍵
7.如何回答登錄功能怎么進行測試?
8.如何回答京東購物車功能怎么進行測試?
9.支付流程測試
10.對于有系統大量并發訪問,你會如何做測試,有什么建議
11.請對這個系統做出測試用例:一個系統,多個攝像頭,抓拍車牌,識別車牌,上傳網上,網上展示
12.請你說一說PC網絡故障,以及如何排除障礙
13.微信紅包
14.微信發朋友圈點贊
15.如何對淘寶搜索框進行測試
16.就linux下的CP命令設計測試用例。
17.請問如果用戶點擊微博的關注圖標但是app上面沒有反應,應該怎么排查這個問題
18.現有一個學生標準化考試批閱試卷,產生成績報告的程序。其規格說明如下:程序的輸入文件由一些有80個字符的記錄組成,如右圖所示,所有記錄分為3組:
三、基礎知識點
1.什么是樁模塊?什么是驅動模塊?
2.什么是扇入?什么是扇出?
3.8020原則:在需求分析開始到集成測試階段引入測試手段,能發現所有缺陷的80%,系統測試階段發現16%,在運行維護階段經過長時間大量運行軟件后,能夠發現4%。起源于經濟學。
4.什么是耦合?什么是內聚?
5.缺陷嚴重程度:
6.缺陷優先級:
7.缺陷狀態:
8.簡單的軟件缺陷生命周期:
9.復雜的軟件缺陷生命周期:
10.什么是在線用戶數?什么是并發用戶數?
11.分布式軟件架構分為:
12.測試人員的能力:
13.簡述負載測試與壓力測試的區別。
14.軟件缺陷管理工具有哪些
15.弱網測試
測試技術面試題
1、什么是兼容性測試?兼容性測試側重哪些方面?
2、我現在有個程序,發現在 Windows 上運行得很慢,怎么判別是程序存在問題還是軟硬件系統 存在問題?
3、測試的策略有哪些?
4、正交表測試用例設計方法的特點是什么?
5、描述使用 bugzilla 缺陷管理工具對軟件缺陷(BUG)跟蹤的管理的流程?
6、你覺得 bugzilla 在使用的過程中,有什么問題?
7、描述測試用例設計的完整過程?
開發及環境搭建類面試題
1、描述軟件產生內存泄露的原因以及檢查方式。(可以結合一種開發語言進行描述)
2、簡述什么是值傳遞,什么是地址傳遞,兩者區別是什么?
3、結構化程序設計和面向對象程序設計各自的特點及優缺點是什么?
4、簡述什么是存儲過程和觸發器?
5、使用 C 語言編寫一個函數,用于交換兩個變量的值(地址傳遞)。
6、請簡述 DNS、活動目錄、域的概念。
7、描述 TCP/IP 協議的層次結構,以及每一層中重要協議。
高級測試工程師簡答題
1、 loadrunner 中的思考時間指的是什么?設置此值有什么意義?請結合你實際的項目經歷談一 下具體的設置情況。
2、 單元測試、集成測試、系統測試、回歸測試、驗收測試中的側重點是什么?
3、 《測試計劃》的書寫過程中應包括哪些內容?
4、 請結合你實際的項目經歷講一個印象最深的缺陷,包括發現、定位分析、跟蹤、解決、回歸 等環節。(選答題)
5、 V 模型幾個階段的詳細內容
專家級測試工程師——簡答題
1、 實際信息化項目中,如何選取測試項和側重點,列舉你實際信息化項目中如何進行選取測試 項和側重點,如何進行風險識別和應急。
2、 項目中測試工作量估計有什么意義,列舉你實際項目中如何進行測試工作量估計的。
3、在 GB/T 9386《計算機軟件測試文檔編制規范》標準中,測試總結中的“差異”包含哪些,列舉 你實際項目中,測試總結中包含哪些“差異”。
人力資源面試題精選
1、你的測試職業發展是什么?你自認為做測試的優勢在哪里?
2、你為什么想離開目前的職務?
3、你對我們公司了解有多少?
4、你找工作時,最重要的考慮因素為何?
5、為什么我們應該錄取你?
6、請談談你個人的最大特色。
7、一個測試工程師應具備那些素質和技能?
性能測試面試題精選
1、什么是負載測試?什么是性能測試?
2、性能測試包含了哪些測試(至少舉出 3 種)
3、簡述性能測試的步驟
4、簡述使用 Loadrunner 的步驟
5、什么時候可以開始執行性能測試?
6、LoadRunner 由哪些部件組成?
7、你使用 LoadRunner 的哪個部件來錄制腳本?
個人信息
1. 公司測試流程?/測試工作怎么開展的?/怎么展開測試?
考察是否熟悉測試過程中各個環節。具備知識:軟件生命周期、bug 生命周期、測試流程。
大概流程為需求評審會議 —> 測試計劃(測試范圍、時間節點、任務分配、測試策略、環境,風險評估)—> 測試用例編寫(測試思維)、內部/項目組評審 —> 測試執行(開發編譯完成,提測):發現 bug 定位 bug,提交并跟蹤 bug,多輪回歸測試,測試結束 —> 整理測試報告–> 發布線上,線上問題跟蹤。
可依據自己公司做適當調整。
2.做過什么項目,負責什么?
3.項目中每個業務扣細節?
4.個人規劃、如何理解測試崗位
5.在最近生活或者工作上,遇到的最有挑戰的事
測試思維
1.紙杯子做什么測試?
反問面試官:這個水杯容量、材質、大小、形狀、功能有無限制?
面試官:沒有限制
我:假設這個水杯 100ml 辦公室一次性的紙質水杯
功能測試、界面測試、易用性測試、兼容性測試、安全測試、性能壓力來思考
功能測試:水杯能否正常裝水,不漏水?100ml 邊界值? 裝冷水開水熱水?能否降解?…
界面測試:外觀顏色、設計、logo、界面文字是否正確?.
易用性測試:隔熱、易握?杯口是否毛刺?設計是否符合人體工學?…
兼容性測試:裝氣體/固體/液體? 不同環境下是否正常?
安全測試:材質質量,是否防止腐蝕能力?防止碰撞,割手?抑制細菌?…
性能壓力:摔多次?是否耐摔?(不同高度) 擠壓(不同角度),是否變形?..
2.發紅包測試用例?
3.微信點贊如何測試?
4. 設計發朋友圈測試用例
5.領取優惠券的頁面如何設計?
6.設計抖音視頻播放頁面測試用例?
7.針對抖音搜索界面,設計測試用例?
8.如何測試一瓶礦泉水?
9.一個項目,有增刪改查接口等,做接口測試,怎么測?
情景問題
1. 視頻卡頓如何排查
2.打開 APP 后頁面空白,怎么排查問題?
答案:
先確保網絡正常、輸入的 URL 地址是正確的
通過瀏覽器調試工具或者抓包工具例 fiddler,查看控制臺的請求和響應,
查看請求地址和參數等是否正常;后臺返回狀態碼、響應數據等是否正常
一般經過以上步驟,基本能夠定位到問題,例控制臺報 js 異常之類的,則前端問題;若返回狀態 500,則后端問題,可同步查看服務器日志來定位
3. 為微信的點贊功能設計測試用例,假如點贊了但是點贊數沒有加一,可能報錯在哪里?
答案:url 定位錯誤、代碼錯誤、斷網操作網絡不好、未更新、次數限制
4. 網絡良好的情況下,發現數據傳輸過程出現 404 的情況,你認為是什么問題。
原因一般來說有幾種情況:
無法在所請求的端口上訪問 Web 站點。
Web 服務擴展鎖定策略阻止本請求。
MIME 映射策略阻止本請求
網站更新改版,但某些局部板塊沿用原來的模塊,而原有的模塊調用的文件已經被刪除或轉移了路徑。
跟蹤訪問的各類腳碼或 CSS 文件無效但調用代碼依然存在。
某個目錄直接刪除
網頁 URL 生成規則改變
網頁文件更名或移動位置
導入鏈接拼寫錯誤等
5. A 給 B 發送消息后,A 看見消息發送出去了,但是 B 沒有收到,怎么排查問題?
6. 網頁加載慢的原因?
7. 與開發人員沖突的處理方法及遇到問題的解決方法
8. 一個 bug 開發不認同是 bug 你該怎么做 ?
首先確認開發環境是否跟自己測試環境一致(有時候開發是在他們已更新代碼的環境上驗證 bug 的,所以 bug 就沒出現,但在測試環境上面會出現),確認在測試環境能重現,如果確認是缺陷跟開發保持有效的溝通,
如果是級別較低的建議性 bug,可以先記錄到 bug 平臺,先保留溝通;
如果是 bug 級別較高的問題,對應需求文檔的預期結果跟開發說明,更有說服力;耐心講解 bug 的危害,不行就找產品確認,確認是 bug 注明情況并再次指派給開發
9. 你正在測試,產品組拿來一個緊急測試讓你測,你該怎么辦?
10. 如果同事進度不能符合預期,影響整體進度怎么辦
11. 如果領導給你一個不熟悉的事件,但很緊急怎么辦?
計算機網絡
1.介紹 OSI 模型
第一層:物理層,功能:利用傳輸介質為通信的主機之間的建立、管理和釋放物理連接,實現比特流的透明傳輸,為數據聯立層提供數據傳輸服務
第二層:數據鏈路層,功能:在物理層提供比特流的基礎上通過建立數據鏈路連接,采用差錯控制與流量控制方法,使有差錯的物理線路變成無差錯的數據鏈路
第三層:網絡層,功能:通過路由選擇算法為分組通過通信子網選擇適當的傳輸路徑,實現流量控制,擁塞控制與網絡互聯的功能
第四層:傳輸層,功能:為分布不同地理位置計算機的進程提供可靠的端對端鏈接與數據傳輸服務;傳輸層向高層屏蔽了底層數據通信的細節
第五層:會話層,功能:負責維護兩個會話主機之間連接的建立、管理和終止,以及數據的交換
第六層:表示層,功能:負責通信系統之間的數據格式變換、數據加密與解密、數據壓縮與恢復
第七層:應用層,功能:實現協同工作的應用程序之間的通信過程控制
2.為什么 TCP 消耗系統資源多
3.TCP 與 UDP 區別
基于連接與無連接;
對系統資源的要求(TCP 較多,UDP 少);
UDP 程序結構較簡單;
流模式與數據報模式 ;
TCP 保證數據正確性,UDP 可能丟包,TCP 保證數據順序,UDP 不保證。
4.TCP 怎么保證可靠連接
5.http 會話保持功能如何實現?
6.http 狀態碼?
1XX:通知。1XX 系列響應代碼僅在與 HTTP 服務器溝通時使用。
2XX: 成功。2XX 系列響應代碼表明操作成功了。
3XX 重定向。3XX 系列響應代碼表明:客戶端需要做些額外工作才能得到所需要的資源。
4XX:客戶端錯誤。這些響應代碼表明客戶端出現錯誤。不是認證信息有問題,就是表示格式或 HTTP 庫本身有問題。客戶端需要自行改正。
5XX 服務端錯誤。這些響應代碼表明服務器端出現錯誤。
7.http 長連接和短連接以及他們分別適用的場景 ?
8.get 和 post 區別?
Get:
a.一般對于從服務器取數據的請求可以設置為 get 方式
b.Get 方式在傳遞參數的時候,一般都會把參數直接拼接在 url 上(例如:http://xxx?id=1&type=2)
c.Get 請求方法可以傳遞的參數數據量是有限的(因為一般參數是拼接在 url 上,而瀏覽器對于 url 的長度是有限制的)
d.Get 請求因為是直接將數據拼接在 url 上,所以安全性不如 post 強(相對),但是 get 的執行效率要快于 post
Post:
a.一般往服務器提交數據的請求會設置為 post 方式
b.Post 方式傳遞參數一般都會把參數放在請求體,而不會拼接在 url
c.Post 請求方法可以提交的數據量不受限制
Post 請求傳參相對于 get 要安全(相對不是絕對),但是 post 的執行效率不如 get。
9.post 主體的格式?
10.http 協議的 header
11.cookie 和 session 是什么,為什么要用 cookie 和 session ?
12.DNS 協議和作用?
13.Https 中的 CA 證書在客戶端還是在服務端?
操作系統
1. 進程和線程的區別?
進程是資源分配的最小單位,線程是程序執行的最小單位。
進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線程是共享進程中的數據的,使用相同的地址空間,因此 CPU 切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。
線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。
但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉并不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
2. 多線程和多進程,以及應用場景?
3. 進程通信方式 ?
4. 內存泄漏?
5. 堆和棧?
棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由 OS 回收 。
6. 堆內存和棧內存?
7. 什么是死鎖,死鎖的條件?
8. 產生死鎖的原因?
可歸結為如下兩點:
a. 競爭資源
系統中的資源可以分為兩類:
可剝奪資源,是指某進程在獲得這類資源后,該資源可以再被其他進程或系統剝奪,CPU 和主存均屬于可剝奪性資源;
另一類資源是不可剝奪資源,當系統把這類資源分配給某進程后,再不能強行收回,只能在進程用完后自行釋放,如磁帶機、打印機等。
產生死鎖中的競爭資源之一指的是競爭不可剝奪資源(例如:系統中只有一臺打印機,可供進程 P1 使用,假定 P1 已占用了打印機,若 P2 繼續要求打印機打印將阻塞)
產生死鎖中的競爭資源另外一種資源指的是競爭臨時資源(臨時資源包括硬件中斷、信號、消息、緩沖區內的消息等),通常消息通信順序進行不當,則會產生死鎖
b. 進程間推進順序非法
若 P1 保持了資源 R1,P2 保持了資源 R2,系統處于不安全狀態,因為這兩個進程再向前推進,便可能發生死鎖
例如,當 P1 運行到 P1:Request(R2)時,將因 R2 已被 P2 占用而阻塞;當 P2 運行到 P2:Request(R1)時,也將因 R1 已被 P1 占用而阻塞,于是發生進程死鎖
9. 如何預防死鎖,!避免死鎖,死鎖發生的檢查?
資源一次性分配:一次性分配所有資源,這樣就不會再有請求了:(破壞請求條件)
只要有一個資源得不到分配,也不給這個進程分配其他的資源:(破壞請保持條件)
可剝奪資源:即當某進程獲得了部分資源,但得不到其它資源,則釋放已占有的資源(破壞不可剝奪條件)
資源有序分配法:系統給每類資源賦予一個編號,每一個進程按編號遞增的順序請求資源,釋放則相反(破壞環路等待條件)
代碼題、算法題
1.裝飾器并寫一個裝飾器例子?
2.找出 數組中出現次數超過一半的數字
3.哈希表的空間復雜度
4.算法題:給你一個字符串,查找出所有的重復子字符串。
5.算法題:樹的深度遍歷:while 循環:棧,先入右子樹節點,后入左子樹節點。
6.算法題:給你一個字符串找出其中的回文字符串,對你的算法設計用例
7.算法題:二叉樹的前序遍歷
Python/Java 基礎
面向對象語言的特性?
深拷貝與淺拷貝?
數據類型分為兩種基礎類型和引用類型
基礎類型:像 Number、String、Boolean 等這種為基本類型
引用類型:Object 和 Array
淺拷貝只是復制了對象的引用地址,兩個對象指向同一個內存地址,所以修改其中任意的值,另一個值都會隨之變化,這就是淺拷貝(例:assign())
深拷貝是將對象及值復制過來,兩個對象修改其中任意的值另一個值不會改變,這就是深拷貝
python 元祖和列表的區別
a=[] 這是一個列表
b=() 這是一個元組
區別:列表可以修改而元組不能修改,例如可以往列表中用 append()添加元素,由于元組是不可修改的所以不存在添加元素的問題。
相同點:列表和元組都是容器,包含了一些列的對象,二者都可以包含任意類型的元素甚至包含序列。
python 去重用什么 ?
python 用過哪些庫函數?
selenium 用到什么程度了?
python 裝飾器,作用,用法
Java:多態說一下,接口類和抽象類的區別;
Java/Python 的垃圾回收機制?
Java 和 python 創建多線程和多進程的方式 ?
Linux
1.常見命令
2.打印當前文件夾文件 ls -al a 所有文件 l 詳細信息
3.查詢 CPU 等情況的命令
答案:free 命令是一個快速查看內存使用情況的方法,它是對 /proc/meminfo 收集到的信息的一個概述。
top 命令提供了實時的運行中的程序的資源使用統計
atop 命令是一個終端環境的監控命令。它顯示的是各種系統資源(CPU, memory, network, I/O, kernel)的綜合,并且在高負載的情況下進行了彩色標注
htop 命令顯示了每個進程的內存實時使用率。它提供了所有進程的常駐內存大小、程序總內存大小、共享庫大小等的報告。列表可以水平及垂直滾動。
ps 命令可以實時的顯示各個進程的內存使用情況。
smem 命令允許你統計基于/proc 信息的不同進程和用戶的內存使用情況。內存使用情況的分析可以導出圖表(如條形圖和餅圖–圖形界面窗口才提供)。
vmstat 命令顯示實時的和平均的統計,覆蓋 CPU、內存、I/O 等內容。例如內存情況,不僅顯示物理內存,也統計虛擬內存。
nmon 是一個基于 ncurses 的系統基準測試工具,它可以監控 CPU、內存、I/O、文件系統及網絡資源等的互動模式。對于內存的使用,它可以實時的顯示 總/剩余內存、交換空間等信息。
數據庫
MySQL 存儲引擎如何實現?
事務概念及其特性?
概念:
1.數據庫事務: 數據庫事務通常指對數據庫進行讀或寫的一個操作序列。
它的存在包含有以下兩個目的:
為數據庫操作提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
當多個應用程序在并發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
多表查詢、普通 SQL 和存儲過程的區別?
索引的底層、底層為什么要采用 B 樹或 B+ 樹?
B 樹和 B+ 樹區別?
熟悉數據庫嗎:學生選課系統怎么建表,查詢一個老師教的所有學生的名字?
取一個年級中每個班級年齡最小的同學名字?
where 和 having 的區別?
答案:
用的地方不一樣
where 可以用于 select、update、delete 和 insert into values(select * from table where …)語句中。 having 只能用于 select 語句中
執行的順序不一樣
where 的搜索條件是在執行語句進行分組之前應用
having 的搜索條件是在分組條件后執行的
即如果 where 和 having 一起用時,where 會先執行,having 后執行
子句有區別
where 子句中的條件表達式 having 都可以跟,而 having 子句中的有些表達式 where 不可以跟;having 子句可以用集合函數(sum、count、avg、max 和 min),而 where 子句不可以。
總結
1.WHERE 子句用來篩選 FROM 子句中指定的操作所產生的行。
2.GROUP BY 子句用來分組 WHERE 子句的輸出。
3.HAVING 子句用來從分組的結果中篩選行
內連接和外連接?
內連接 則是只有條件的交叉連接,根據某個條件篩選出符合條件的記錄,不符合
條件的記錄不會出現在結果集中,即內連接只連接匹配的行。
外連接 其結果集中不僅包含符合連接條件的行,而且還會包括左表、右表或兩個
表中的所有數據行,這三種情況依次稱之為左外連接,右外連接,和全外連接。
左外連接,也稱左連接,左表為主表,左表中的所有記錄都會出現在結果集中,
對于那些在右表中并沒有匹配的記錄,仍然要顯示,右邊對應的那些字段值以
NULL 來填充。右外連接,也稱右連接,右表為主表,右表中的所有記錄都會出現
在結果集中。左連接和右連接可以互換,MySQL 目前還不支持全外連接。
數據庫字段去重?
SQL 語句 查詢每一門課程分數都大于 80 分的學生姓名?
SELECT 姓名 FROM Student GROUP BY 科目 Having MIN(成績)>=80
測試基礎有哪些內容呢?
測試的定義、測試的分類、測試的方法、測試的生命周期。
測試計劃、測試方案、測試策略、測試用例的編寫。
BUG的定義、BUG的分類、BUG的六要素、BUG的生命周期。
測試和開發流程的關系、瀑布流、V字形、W字型(雙V)、螺旋型、敏捷等等。
戴明環、5W2H等分析管理的方法
質量管理體系CMMI(了解)
必備技能
- 軟件測試的定義、生命周期、工作流程、需求分析;
- 測試用例的設計、編寫、評審;bug的基本知識以及禪道的使用;
- 測試計劃、測試報告的編寫;
- SVN、Git版本控制工具的使用;
假如一個項目拿到手之后,按照下面的一套流程跑一遍:
發布項目進行立項,建立項目組進行分工;
需求評審,學會如何看需求文檔,進行需求分析,羅列測試點;
整理測試點,編寫測試用例,然后進行用例評審;
執行測試,比如功能、界面、前后臺、兼容性、數據庫,對于發現的bug提交到禪道;
分析、總結、編寫測試報告;
這個流程完整的跑一遍之后,只能說對于整體的測試流程算是掌握了,但是仍然不足以找到一份合適的工作,想要學會做功能測試,以下的內容也是必須掌握的:
Linux相關技能
操作環境、命令、安裝數據庫、部署測試環境等
數據庫相關技能
各種命令用法、字段、增刪改查
接口測試相關技能
接口測試基本理論、http協議、測試方法;
接口測試需求分析、用例編寫、評審;
幾種工具的掌握,jmeter、postman、soupUI;
APP測試相關技能
安裝/卸載、離線、UI、登錄等測試內容;
兼容性測試、monkey、fiddler抓包;
為什么很多程序員做不了軟件架構師?
1、良好健康的職業規劃很重要,但大多數人都忽略了
2、學習的習慣很重要,持之以恒才是正解。
3、編程思維沒能提升一個臺階,局限在了編碼,業務,沒考慮過選型、擴展
4、身邊沒有好的架構師引導、培養。所處的圈子對程序員的成長影響巨大。
軟件測試基礎-高級系統學習——MySQL性能優化
前言
MySQL性能優化必知:長連接、短連接、連接池
當數據庫服務器和客戶端位于不同的主機時,就需要建立網絡連接來進行通信。客戶端必須使用數據庫連接來發送命令和接收應答、數據。通過提供給客戶端數據庫的驅動指定連接字符串后,客戶端就可以和數據庫建立連接了。可以查閱程序語言手冊來獲知通過何種方式使用短連接、長連接。
1. 短連接
短連接是指程序和數據庫通信時需要建立連接,執行操作后,連接關閉。短連接簡單來說就是每一次操作數據庫,都要打開和關閉數據庫連接,基本步驟是:連接→數據傳輸→關閉連接。
在慢速網絡下使用短連接,連接的開銷會很大;在生產繁忙的系統中,連接也可能會受到系統端口數的限制,如果要每秒建立幾千個連接,那么連接斷開后,端口不會被馬上回收利用,必須經歷一個“FIN”階段的等待,直到可被回收利用為止,這樣就可能會導致端口資源不夠用。在 Linux上,可以通過調整/proc/sys/net/ipv4/ip_local_port_range來擴大端口的使用范圍;調整/proc/sys/net/ipv4/tcp_fin_timeout來減少回收延期(如果想在應用服務器上調整這個參數,一定要慎重!)。
另外一個辦法是主機使用多個IP地址。端口數的限制其實是基于同一個IP:PORT的,如果主機增加了IP,MySQL就可以監聽多個IP地址,客戶端也可以選擇連接某個IP:PORT,這樣就增加了端口資源。
2. 長連接
長連接是指程序之間的連接在建立之后,就一直打開,被后續程序重用。使用長連接的初衷是減少連接的開銷,盡管MySQL的連接比其他數據庫要快得多。
以PHP程序為例,當收到一個永久連接的請求時,PHP將檢查是否已經存在一個(前面已經開啟了的)相同的永久連接。如果存在,則將直接使用這個連接;如果不存在,則建立一個新的連接。所謂“相同”的連接是指用相同的用戶名和密碼到相同主機的連接。
從客戶端的角度來說,使用長連接有一個好處,可以不用每次創建新連接,若客戶端對MySQL服務器的連接請求很頻繁,永久連接將更加高效。對于高并發業務,如果可能會碰到連接的沖擊,推薦使用長連接或連接池。
從服務器的角度來看,情況則略有不同,它可以節省創建連接的開銷,但維持連接也是需要內存的。如果濫用長連接的話,可能會使用過多的MySQL服務器連接。現代的操作系統可以擁有幾千個MySQL連接,但很有可能絕大部分都是睡眠(sleep)狀態的,這樣的工作方式不夠高效,而且連接占據內存,也會導致內存的浪費。
對于擴展性好的站點來說,其實大部分的訪問并不需要連接數據庫。如果用戶需要頻繁訪問數據庫,那么可能會在流量增大的時候產生性能問題,此時長短連接都是無法解決問題的,所以應該進行合理的設計和優化來避免性能問題。
如果客戶端和MySQL數據庫之間有連接池或Proxy代理,一般在客戶端推薦使用短連接。對于長連接的使用一定要慎重,不可濫用。如果沒有每秒幾百、上千的新連接請求,就不一定需要長連接,也無法從長連接中得到太多好處。在Java語言中,由于有連接池,如果控制得當,則不會對數據庫有較大的沖擊,但PHP的長連接可能導致數據庫的連接數超過限制,或者占用過多的內存。
對此,研發工程師、系統運維工程師、DBA需要保持溝通,確定合理的連接策略,千萬不要不假思索就采用長連接。
3. 連接池
由于一些數據庫創建和銷毀連接的開銷很大,或者相對于所執行的具體數據操作,連接所耗的資源過多,此時就可能需要添加連接池來改進性能。
數據庫連接池是一些網絡代理服務或應用服務器實現的特性,如J2EE服務器,它實現了一個持久連接的“池”,允許其他程序、客戶端來連接,這個連接池將被所有連接的客戶端共享使用,連接池可以加速連接,也可以減少數據庫連接,降低數據庫服務器的負載。
4. 持久連接和連接池的區別
長連接是一些驅動、驅動框架、ORM工具的特性,由驅動來保持連接句柄的打開,以便后續的數據庫操作可以重用連接,從而減少數據庫的連接開銷。而連接池是應用服務器的組件,它可以通過參數來配置連接數、連接檢測、連接的生命周期等。
如果連接池或長連接使用的連接數很多,有可能會超過數據庫實例的限制,那么就需要留意連接相關的設置了,比如連接池的最小、最大連接數設置,以及php-fpm的進程個數等,否則程序將不能申請新的連接。
讓你在職場新人中脫穎而出,你覺得下面哪三項最為關鍵?】
然后下面列出的能力清單有以下選項:
- 1.積極的職業和態度
- 2.專業的知識和技能
- 3.良好的職業習慣
- 擁有核心的硬技能
- 清晰的職業定位
- 善于處理人際關系
- 時間管理能力
- 找到并運用天賦
軟件測試學習筆記-概念篇(一)
正文
軟件測試概述
軟件測試的歷史
什么是軟件測試:
早期定義:軟件測試是對程序能夠按預期運行建立起一種信心。
經典定義:測試是為了發現錯誤而執行程序的過程。
IEEE定義(ISO/IEC/IEEE 29119):使用人工或者自動的手段來運行或測量軟件系統的過程,以檢驗軟件系統是否滿足規定的要求,并找出與預期結果之間的差異。
軟件測試≠程序測試
五大要素和兩個目標:
五大要素有:質量、人員、資源、流程、技術。
其中最主要的是軟件質量,其他四個要素都是為質量服務的。
其次是人員,決定了技術,資源,流程,以及配置和使用。
技術包含了:軟件測試技術、軟件測試方法、使用的工具。技術是手段。
流程:測試計劃,測試用例,測試執行,測試報告。有一些進入進出的標準(規范性,對軟件測試做一個規范的要求)。
資源:測試所需要的硬件設備、網絡環境、測試設備、測試時間(周期)。
注意:人不是資源。
目標:
①提升測試覆蓋率-> 能夠有效的保證軟件的質量
②提升測試效率->能夠使我們更好地完成軟件測試
軟件測試所遵循的原則
一、測試顯示缺陷的存在,但不能證明系統不存在缺陷。
經過軟件測試,可以發現軟件中的故障;但是經過軟件測試,不能保證軟件就沒有故障了。
二、窮盡測試是不可能的,應設定及時終止的條件。
三、測試應該盡早進行
四、缺陷具備群集特性
越是發現問題多的模塊,越是需要重點測試的對象
五、測試的殺蟲劑悖論
在測試中,如果采用同樣的測試用例,同樣的測試方法。多次重復的測試某一個模塊,最后就不能再發現新的缺陷。所以說,測試用例和測試方法應該不定期的評審修改,并且增加不同的測試方法和用例來測試不同的部分,從而更多的發現軟件的缺陷。
六、測試的二八原則
測試時間和資源往往是有限的,要找出所有的缺陷是不可能的,這時我們需要遵循二八原則。
把80%的時間或者資源用在20%的重點模塊上,重點測試模塊中20%的重要模塊。來達到測試效率和資源配置的最佳的比例。
七、測試活動依賴于測試背景
針對不同的測試背景針對的活動是不同的,比如:電信級的軟件對性能、大并發量的訪問會有更高的要求。而金融,銀行系統相關的軟件,對安全性能要求更高。
軟件測試階段,手段,模式
按測試階段來分類
單元測試、繼承測試、系統測試、驗收測試
單元測試
什么是單元測試
對軟件中的最小可測試單元進行檢查和驗證
單元測試的原則:
1.盡可能保證各個測試用例是相互獨立的;
2.一般由代碼的開發人員來實施,用以檢驗所開發的代碼功能符合自己的設計要求。
單元測試的益處:
1.能盡早發現缺陷;收益最高;
2.有利于重構;
3.簡化集成;
4.文檔;
5.用于設計;
單元測試的限制
1.不可能覆蓋所有的執行路徑,所以不可能保證捕捉到所有路徑的錯誤;
2.每一行代碼,一般需要3-5行測試代碼才能完成單元測試。所以存在投入和產出的一個平衡;
單元測試框架:
Xunit,JUnit,nunit,PPUnit,CppUnit
集成測試:
定義:
在單元測試的基礎上,測試在將所有的軟件單元按照概要設計規格說明的要求組裝成模塊、子系統或系統過程中各部分工作是否達到或實現相應技術指標及要求的活動
集成測試的主要實施方案
1.Big Bang 全部完成,測試
2.自頂向下
3.自底向上 從最低層測試,逐步組裝測試;(常用測試)
4.核心系統集成
5.高頻集成
集成測試&單元測試
1.測試的對象不同;
2.測試的一舉不同;
3.測試的方法不同;
系統測試
定義:是將經過集成測試的軟件,作為計算機系統的一個部分,系統中其他部分結合起來,在實際運行環境下對計算機系統進行的一系列嚴格有效的測試,以發現軟件潛在的問題,保證系統的正常運行。
關注點
關注系統本身的使用
關注系統與其他相關系統間的連通
關注系統在不同使用壓力下的表現
關注系統在真實使用環境下的表現
系統測試&集成測試
測試環境:
集成測試:由通過了單元測試的各個模塊所集成起來的構件
系統測試:除了軟件之外,還包括計算機硬件及相關的外圍設備、數據采集和傳輸機構、支持軟件、系統操作人員等整個系統;
測試時間:
集成測試介于單元測試和系統測試之間測試
系統測試在集成測試之后
測試內容:
集成測試:各個單元模塊之間的接口
系統測試:整個系統的功能和性能
測試角度:
集成測試:偏向于技術角度的驗證
系統測試:偏向于業務角度的驗證
驗收測試
定義:也稱交付測試,針對用戶需求、業務流程的正式的測試,確定系統是否滿足驗收標準,由用戶、客戶、或其他授權機構決定是否接受系統。
細分
用戶驗收測試
運行驗收測試
合同和規范驗收測試
alpha測試
Beta測試
按測試手段來分類:
黑盒測試、白盒測試
靜態測試、動態測試
手工測試、自動化測試
黑盒測試
定義:把程序看作一個不能打開的黑盒子,在完全不考慮程序內部結構和內部特性的情況下,在程序接口進行測試,它只檢查程序功能是否按照需求規格說明書的規定正常使用,程序是否能適當地接收輸入數據而產生正確的輸出信息。主要針對軟件界面和軟件功能進行測試。
圖例:
優點:
1.容易實施,不需要關注內部的實現
2.更貼近用戶的使用角度
缺點:
1.測試覆蓋率角度,一般只能覆蓋到代碼量的不到40%;
2.針對黑盒測試的自動化測試,復用率較低,維護成本較高;
關注點:
1.是否有不正確或者遺漏的功能?
2.在接口上,輸入是否能正確的接受?能否輸出正確的結果?
3.是否有數據結構錯誤或者外部信息(例如數據文件)訪問錯誤?
4.性能上是否能夠滿足要求?
黑盒測試的主要設計方法
白盒測試
定義
白盒測試又稱結構測試、透明盒測試、邏輯驅動測試或基于代碼的測試。白盒測試是一種測試用例方法,盒子指的是被測試的軟件,白盒指的是盒子是可視的,你清楚盒子內部的東西以及里面是如何運作的。"白盒"法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。"白盒"法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內部結構,從檢查程序的邏輯著手,得出測試數據。貫穿程序的獨立路徑數是天文數字。
圖示:
優點:
1.迫使測試人員去仔細思考軟件的實現,理解原理
2.可以檢測代碼中的每一條分支和路徑
3.揭示隱藏在代碼中的錯誤
4.對代碼的測試比較徹底
缺點:
1.昂貴
2.無法檢測代碼中遺落的路徑和數據敏感性錯誤
3.不能直接驗證需求的正確性
主要測試方法:
靜態測試
定義:
靜態測試是指無須執行被測程序,而是通過評審軟件文檔或代碼,度量程序靜態復雜度,檢查軟件是否符合編碼標準,借以發現編寫的程序的不足之處,減少錯誤出現的概率;
方式:
動態測試
定義:
動態測試時指通過運行被測程序,檢查運行結果與預期結果的差異,并分析運行效率,正確性和健壯性等;
手動測試
定義:
由專門的測試人員從用戶視角來驗證軟件是否滿足設計要求的行為。更適用針對深度的測試和強調主管判斷的測試。
方法:眾包測試,探索式測試
自動化測試:
定義:使用單獨的測試工具軟件控制測試的自動化執行以及對預期和結果進行自動檢查。
方法:單元測試,接口測試,性能測試等
手工測試VS自動化測試
按測試模式來測試來分類
瀑布模型、敏捷測試、基于腳本的測試、基于風險的測試、探索式測試等
瀑布模型的優缺點
V模型
W模型
X模型
H模型
敏捷測試
Agile Testing --遵循敏捷宣言的一種測試實踐
敏捷宣言
注點:
強調從客戶角度進行測試
重點關注迭代測試新功能,不在強調測試階段
盡早測試,不間斷測試,具備條件即測試
強調持續反饋
預防缺陷重于發現缺陷
敏捷測試VS傳統測試
探索式測試(ET)
完全拋開測試腳本的測試
它是一種測試風格、思維而不是一種技術
優點:
更能激發測試人員的創造性和工作樂趣
增加了發現新的或較深入Bug的可能性
在較短時間內找到更多Bug以及對SUT作一個快速的評估
有利于更加有效地實施自動化
更加適用于敏捷項目
減少了在簡單、繁復上用例的無謂編寫時間
測試管理上有局限性,較難協調和控制
對于Bug的重復利用和重現上作用有限
對測試人員的測試技能和業務知識深度依賴較大
只有在SUT已完全可用的前提下才更有作用
ET的生產率很難定義
ET本身較難進行自動化
局部探索式測試
輸入、狀態、代碼路徑、用戶數據、執行環境
全局探索式測試
基于風險的測試-RBT
Risk-based Testing
一種基于對軟件失效的風險評估并以此指導測試計劃、設計、執行、結果評估的軟件測試類型
那些是風險?
質量風險、管理風險
風險級別=風險可能性X風險嚴重度
初、中、高級測試工程師面試題匯總(附答案)
技巧篇
做題
看完面試題之后那就來做一下面試題目吧, 目前找到兩個網站
SillGun(國外網站, 自備梯子)
牛客網
聊面試
(帥張)stormzhang 跟你談一下面試那些事兒
面試時企業最看中你什么能力?
我面試到底問什么?
面試那些事兒
互聯網招聘平臺
拉勾-專注互聯網職業機會
簡尋-讓職位推薦更精準
100 offer-幫最好的互聯網人發現更好的offer
BOSS 直聘-互聯網招聘神器
LinkedIn (領英)
哪上班
一力頂十巧(刷題)
【熱身題】
1.為什么選擇測試這行?
因為其具有挑戰性和成就感,找一些系統隱藏的邏輯漏洞的時候,自己就非常的開心。并且測試需要細心和耐心,自己可以很快的分析bug的來源。
2.請描述下你公司的測試流程?
需求分析討論-確定測試策略-設計測試用例-測試用例評審-beta測試-uat測試-測試報告
【基礎題】
1.軟件測試項目從什么時候開始為什么?
需求確認開始,因為在需求階段,測試可以評審需求并進行靜態測試,減少開發過程中的bug。
2.軟件的評審一般由哪些人員參加?其目的是什么?
參加人員:需求業務人員、產品經理、項目經理、開發人員、測試人員;
目的:查看軟件在未正式投入運行前是否還存在問題。對于不同軟硬件平臺能否正常運行,是否有與客戶理解不一致的地方,同時可以對一些可以改進的地方再多加改進。
3.如何設計測試用例?什么樣子的測試用例是好用例?
掌握邊界值分析、等價類劃分、錯誤推測等方法來設計測試用例。
好用例是一個完備的集合,它能夠覆蓋所有等價類以及各種邊界值;需要從軟件功能需求出發,全面地,無遺漏地識別出測試需求;最好是代碼覆蓋測試也全面的測試。
4.不能發現BUG的測試用例不是好的測試用例嗎?
不一定,要看情況,如果測試用例質量高,沒有發現bug,說明開發質量高。但一般程序都會有bug,如果沒有發現BUG,就要思索測試場景是否有遺漏,需求是否理解沒到位。
5.測試用例需要哪些人來評審?
產品經理,開發人員,測試人員,業務需求人員。
6.什么是bug?
沒有實現需求說明書列出的功能,出現了沒有需求說明書提到不該出現的事情;實現了多的功能;沒有實現應該實現的邏輯。
7.簡單概述缺陷報告,并說明包括哪些項?
缺陷描述,缺陷的優先級,缺陷的標題,缺陷所屬版本號,缺陷所屬的功能模塊,操作步驟,預期效果,缺陷原因,缺陷所屬的開發人員。
8.開發人員修復缺陷后,如何保證不影響其他功能?
重新執行測試用例,并且針對這個缺陷影響的相關點寫新的測試用例。
9.開發人員說不是bug時,你如何應付?
首先把自己的理由,并以需求說明書為自己的站點,如果開發人員還是不認同,可以把自己的觀點和理由,提交給產品經理,由其去決定是否為一個bug。
10.當測試過程發生錯誤時,有哪幾種解決辦法?
a.跳轉其他的測試流程;
b.調用某個程序能繞過這個錯誤,繼續后面的流程。
11.所有的軟件缺陷都能修復嗎?所有的軟件缺陷都要修復嗎?
能修復,但不一定所有的缺陷都要修復。
12.進行測試時產生了哪些文檔或記錄?
測試用例,測試報告,測試日報
14.功能測試在 beta 版本對外的上線標準是什么?
測試用例全部跑完并且bug都已經關閉,然后業務驗收后可以上線。
15.開發人員老是犯一些低級錯誤怎么解決?
a.要求開發人員進行自測,把這些問題在開發階段就解決好
b.通過缺陷管理系統對開發人員進行控制
16.為什么盡量不要讓時間富裕的員工去做一些測試?
a.非專業測試人員,沒有組織性的測試工作,沒有規律和針對性,會影響到測試的質量和版本更新的速度。
b.專業測試人員(但不是這個項目的測試員)這些人員不受測試計劃的時候和任務約定,測試完畢后評估測試小組的工作質量,不利于bug管理。
###【進階題】
1.什么是單元測試、功能測試、集成測試?
加分項:單元測試、功能測試、集成測試分別在web端、接口端、移動端的定義,你平時是怎么理解它們的?
單元測試:是針對程序模塊來進行正確性檢驗的測試工作;
功能測試:在單元測試的基礎上,測試某一個功能點;
集成測試:將所有模塊按照設計要求組裝成為子系統或系統,進行集成測試;
web端
單元測試/功能測試:頁面元素是否正確顯示其有效功能,如提交的action是否正確,搜索點擊是否執行;
集成測試:調用了后端接口的數據是否顯示正常,能否滿足需求;
接口端:模塊/系統之前的調用,接口是否與設計相符,模塊組合后是否滿足需求;
單元測試:某個函數/方法 寫的代碼是否達到編寫者的預期;
功能測試:為實現一個功能點,調用幾個方法/函數。
2.什么是兼容性測試?
兼容性測試是檢查軟件在不同軟件平臺,硬件平臺上是否可以正常運行的測試。
主要查看軟件在不同操作系統、瀏覽器、數據庫中是否運行正常.
3.白盒和黑盒的區別,你是怎么運用的?
黑盒測試:已知產品的功能設計規格,可以進行測試證明每個實現了的功能是否符合要求。利用其檢查功能是否符合需求說明書,能夠正常使用。
白盒測試:已知產品的內部工作過程,可以進行測試證明每種內部操作是否符合設計規格要求,所有內部成分是否經過檢查。
利用其檢查程序模塊的內部邏輯走向,主要覆蓋程序內的邏輯。
4.靜態測試和動態測試有什么區別?
靜態測試:不運行程序,針對PRD等檢查代碼,審查代碼,靜態結構分析,分析代碼質量;
動態測試:運行程序進行黑盒測試和白盒測試。
5.您所熟悉的測試用例設計方法都有哪些?請分別以具體的例子來說明這些方法在測試用例設計工作中的應用。
黑盒:
邊界值分析法:如參數的范圍0-128,輸入128,129,0這些值,查看是否有錯誤等;
錯誤推測法:導入功能時,表格為空表格,表格輸入1行,表格輸入10000行等;
因果圖方法:組合參數邏輯圖;
場景分析法:根據用戶操作模擬用戶操作。
白盒:
邏輯覆蓋法,基本路徑測試。
6.您在以往的測試工作中都曾經具體從事過哪些工作?其中最擅長哪部分工作?
做過web測試,小程序測試,H5頁面測試,后臺測試,接口測試。最擅長接口測試,自己給公司的業務流程寫過一套自動化框架,用于回歸業務流程。
7.在您以往的工作中,一條軟件缺陷(或者叫Bug)記錄都包含了哪些內容?如何提交高質量的軟件缺陷(Bug)記錄?
前提條件、測試環境、操作步驟、預期結果、實際結果、嚴重等級、版本信息,出現概率;
問題描述和操作步驟要盡可能描述詳細,可以初步分析bug是客戶端的問題還是服務端的問題。
8.什么是內存泄漏、Http錯誤率、吞吐率。響應時間分別在web端和移動端是多少?哪些場景可以證明響應超時?
內存泄漏(Memory Leak)是指程序中己動態分配的堆內存由于某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。
HTTP錯誤率(HTTP error rate) 在選定時間段內,HTTP錯誤數量與請求數量的比率。
吞吐率(Throughput) 是場景運行過程中服務器每秒的吞吐量。其度量單位是字節,表示每個請求連接在任何給定的每一秒從服務器獲得的數據量。
web端
當用戶在2秒以內得到響應時,會感覺系統的響應很快;
當用戶在2-5秒之間得到響應時,會感覺系統的響應速度還可以;
而當用戶在超過8秒后仍然無法得到響應時,會感覺系統糟透了,或者認為系統已經失去響應。
場景:請求超時、頁面加載失敗
【高級題】
1.什么是面向對象編程?
面向對象編程就是把具有共性的事務抽象成屬性和方法來進行編程。
2.Thread 類中的start() 和 run() 方法有什么區別?
start()方法可以用來啟動線程,調用該方法,會創建一個新的線程,然后內部執行run()方法;不能多次調用,否則會拋異常;
直接調用run()方法,不會創建新的線程;可以進行多次調用。
3.說下左連接和右連接
比如有兩張表 A,B。左連接是把符合條件的所有A表的內容列出來,B表如果沒有內容匹配用NULL代替。
右連接是符合條件的所有B表的內容列出來,A表如果沒有內容匹配用NULL代替。
4.介紹下什么是索引
索引是由表或者視圖中的一列或多列生成的鍵,可以加快在表或者視圖中檢索行的速度
【接口測試相關】
1.什么是接口測試?
接口測試是測試系統組件間接口的一種測試。接口測試就是測試不同系統或模塊之間資源交互是否正確。
2.為什么要做接口測試?
因為在大部分系統和產品中,資源數據都是核心,所以接口是需要要測試的,并且接口中大部分內容都是數據,通過數據的對比可以推測系統和產品的邏輯,測試接口就是測試邏輯。所以很必要做接口測試。
3.什么時候做接口測試?
a.出現bug,通過接口測試,清晰找到bug的源頭,是前端還是后端的bug;
b.回歸測試,利用接口測試原有的接口是否正常,保證之前的業務流程沒有受影響;
c.接口開發完成后,可以做接口測試。
4.接口測試的工具有哪些
soapUI、postman、jemeter、insomnia、paw。
5.接口測試的流程是什么?
a.接口的通過性驗證:數據正確輸入,是否正確返回結果。測試接口的正常場景和異常場景;
b.邊界測試:不按照你接口文檔上的要求輸入參數,測試其邊界情況。比如說必填的參數不填,輸入整數類型的正常,超過參數取值范圍等;
c.參數組合:如果接口中有參數需要組合用的,兩個參數是組合使用,測試其各種情況;
d.異常驗證:測試冪等情況,并發情況,事務測試等異常情況;
e.接口安全:繞過驗證,敏感信息加密等情況;
f.性能測試:響應時間、并發數、吞吐量、服務器資源利用率。
6.請問你們公司是如何做接口測試的?
swagger 、 接口自動化腳本。
7.接口測試質量評估標準是什么?
接口表現與接口文檔的一致性;
請求參數:必選和非必選、長度、字符類型、為空、缺失、組合、重復;
返回數據:正常和異常。
【自動化測試相關】
1.如何看待自動化和手動測試?怎樣的一個比例才是健康的?
自動化適合做為回歸測試的主要方式,新上線的功能一般都是用手動測試方式,一些極端和用戶習慣操作還是手動測試比較方便。盡可能線上穩定的功能模塊都做成自動化,提供效率。
2.你們公司的自動化投入產出比怎樣?效益怎樣?
自動化主要作為回歸測試,減少測試時間。UI自動化沒有弄,基本找不到bug 。
3.完整運行一次自動化用例需要多久時間?
主要跑的是業務流,所以跑一次需要半個小時左右。
4.什么是分層自動化?
金字塔結構, 最底層UnitTest,往上接口API/集成起來的service, 最上面UI自動化。
5.你的測試數據是怎么準備的?
提前準備好,在代碼里的yaml文件。
6.測試腳本的維護成本是怎么樣的?
業務不變的情況下,一般腳本都是不壞不動的。
【性能測試相關】
1.請問你們公司是如何做性能測試的?請講訴性能測試的相關指標?
a.做性能需求分析,挑選了用戶使用最頻繁的功能來做性能測試,比如:登陸,搜索,提交訂單,確定性能指標,比如:事務通過率為100%,90%的事務響應時間不超過5秒,并發用戶為1000人,CPU和內存的使用率為70%以下;
b.性能測試計劃,明確測試時間(通常在功能穩定后,如第一輪測試后進行)和測試環境和測試工具的選擇;
c.編寫性能測試用例;
d.搭建性能測試環境,準備好性能測試數據;
e.通過性能測試用例,編寫性能測試腳本;
f.性能測試腳本進行調優,設置檢查點、參數化、關聯、集合點、事務,調整思考時間,刪除冗余的腳本等;
g.設計性能測試場景,使用nmon工具監控服務器,運行測試場景;
h.分析性能測試結果,如果有問題(性能瓶頸),收集相關的日志提單給開發修改;
i.開發修改好后,回歸性能測試;
j.編寫性能測試報告;
相關指標:響應時間、并發數、吞吐率、資源利用率、TPS。
2.壓力測試和負載測試的區別
負載測試是模擬實際軟件系統所承受的負載條件的系統負荷,通過不斷加載(如逐漸增加模擬用戶的數量)或其它加載方式來觀察不同負載下系統的響應時間和數據吞吐量、系統占用的資源(如CPU、內存)等,以檢驗系統的行為和特性,以發現系統可能存在的性能瓶頸、內存泄漏、不能實時同步等問題。
壓力測試是在高負載情況下對系統的穩定性進行測試。是在高負載(大數據量、大量并發用戶等)下的測試,觀察系統在峰值使用情況下的表現,從而發現系統的功能隱患。
負載測試:多用戶,用戶數漸增,持續同時發同一業務請求,產出最大TPS;
壓力測試:多用戶,資源使用飽和,持續同時發同一業務請求,產出系統瓶頸或使用極限。
3.服務器中一般要監控哪些數據,如何監控的,怎么從監控數據中發現問題?
基礎監控和應用監控。
基礎監控包括機器是否死機,cpu,內存,磁盤使用率等;應用監控包括日志監控、端口監控、進程數監控等。
4.假設系統A調用系統B,我把B的接口都mock了,進行性能測試,這樣有什么好處和壞處?
好處:防止系統B出錯引起測試錯誤;不會因系統B的開發進度影響測試;mock后可以快速返回結果,提高測試效率。
壞處:很多情況下無法完全模擬出服務器的所有可能的返回情況,另外,mock掉了關聯方之后,整個環境的連通性可能測試的不到位。
5.有一天早上打車高峰,滴滴服務端掛了大概30分鐘,工程師搶修之后,馬上上線,之后又掛了,請問有哪些原因會造成這個情況?
服務器內存不夠、服務器超出負載、并發量太大、遇到惡意攻擊。
【編程相關】
1.請寫出冒泡排序
#冒泡排序:n*n
def bubbleSort(array):
??maxindex = len(array)-1
? maxValue = array[maxindex]
? k=0
? while maxindex:
????? for i in range(1,maxindex):
????????? if array[i-1]>array[i]:
????????????? temp = array[i]
????????????? array[i] = array[i-1]
????????????? array[i-1] = temp
????????? k+=1
????? maxindex -=1
? print(k)
? return array
2.1~9999數列中數字3出現的次數。用遞推方法解出。
def count_digit(number):
??? return len(str(number))
def countThree(digit):
??? if not isinstance(digit,int):
??????? raise TypeError('number is not int')
??? # digit = len(str(number))
??? if(digit <=0):
??????? return 0
??? if(digit ==1):
??????? return 1
??? return 10*countThree(digit-1) + 10 **(digit-1)
print(countThree(count_digit(9999)))
3.從一個數組中找出前4個最大的數,用最優解。
#快速排序:最快的n*logN
def qiuckSort(list):
??? if len(list)<2:
??????? return list
??? mid = list[0]
??? left = [i for i in list[1:] if i <= mid]
??? right = [i for i in list[1:] if i > mid]
??? finallyList = qiuckSort(left)+[mid] + qiuckSort(right)
??? return finallyList
array = [3, 0, 1, 832,23,45, 5, 5, 6,46, 9, 56, 897]
print(qiuckSort(array)[-4:])
4.寫一段程序,刪除字符串a中包含的字符串b,舉例 輸入a = “asdw”,b = “sd” 返回 字符串 “aw”,并且測試這個程序。
def delBString(a,b):
??? if not isinstance(a,str):
??????? raise TypeError("a is not str")
??? if not isinstance(b,str):
??????? raise TypeError("b is not str")
??? if len(a) < len(b):
??????? raise Exception('a length must large to b length')
??? result = []
??? flag = False
??? i=0
??? la = len(a)
??? lb = len(b)
??? while i <la:
? ??????j = 0
??????? while j < lb:
??????????? if i+j < la and a[i+j] == b[j]:
??????????????? j += 1
??????????? else :
??????????????? j += 1
??????????????? flag = False
??????????????? break
??????????? flag = True
??????? if flag:
??????????? i += lb
??????? else:
??????????? result.append(a[i])
??????????? i += 1
??? return "".join(result)
測試用例:
class TestdelInnerStringFunctions():
??? def setUp(self):
??????? pass
??? def tearDown(self):
??????? pass
??? def test_nomorl1(self):
??????? assert delBString('asdqwe','we') == 'asdq'
??? def test_nomorl2(self):
??????? assert delBString('asdqwe','0') == 'asdqwe'
??? def test_nomorl3(self):
??????? assert delBString('測試asdqwe','we') == '測試asdq'
??? def test_nomorl4(self):
??????? assert delBString('測試asdqwe','測試') == 'asdqwe'
??? def test_nomorl5(self):
??????? assert delBString('asdqwe','') == 'asdqwe'
??? def test_nomorl6(self):
??????? with pytest.raises(TypeError):
??????????? delBString('', 0)
??? def test_nomorl7(self):
??????? with pytest.raises(TypeError):
??????????? delBString(0, 'as')
??? def test_nomorl8(self):
??????? with pytest.raises(TypeError):
??????????? delBString(True)
??? def test_nomorl9(self):
?????? with pytest.raises(Exception) as excinfo:
?????????? delBString('acd','acde')
?????? assert "a length must large to b length" in str(excinfo.value)
?????? assert excinfo.type == Exception
5.寫一個方法,把字符串轉為數字,比如 str=“1234”,變成 int 1234。并且測試這個程序。
def StrToInt(a):
??? res ,mult,flag = 0,1,1
??? if not isinstance(a,str):
??????? raise TypeError("a is not str")
??? if a[0] =='-' or a[0] == '+':
??????? if a[0] == '-':
??????????? flag = -1
??????? a = a[1:]
??? for i in range(len(a)-1,-1,-1):
??????? if '9' >=a[i] >= '0':
??????????? res +=(ord(a[i]) -48) * mult
??????????? mult = mult *10
??????? else :
??????????? return 0
??? return res * flag
def test_strToInt2(self):
??? with pytest.raises(TypeError):
??????? StrToInt(34)
測試用例:
def test_strToInt3(self):
??? assert StrToInt('測試賽') == 0
def test_strToInt4(self):
??? assert StrToInt('+2147689') == 2147689
def test_strToInt5(self):
??? assert StrToInt('45') == 45
def test_strToInt6(self):
??? assert StrToInt('1a33') == 0
def test_strToInt7(self):
??? assert StrToInt('-5') == -5
6.給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
# Python
def TargetSum(nums,target):
??? if len(nums) < 2:
??????? return 0
??? for i in range(0,len(nums)-1):
??????? for j in range (i+1,len(nums)):
??????????? if nums[i] + nums[j] == target:
??????????????? return [i,j]
# 測試用例
def test_TargetSum1(self):
??? assert TargetSum([1,1,3,6,0,2],2) == [0,1]
def test_TargetSum2(self):
??? assert TargetSum([1],1) == 0
def test_TargetSum3(self):
??? assert TargetSum([6,2,4,3,1,2],4) == [1,5]
def test_TargetSum4(self):
??? assert TargetSum([2, 7, 11, 15],9) == [0,1]
public int[] TargetSum(int nums[],int target){
??Map<Integer, Integer> map = new HashMap<>();
? for(int i=0;i<nums.length;i++){
?? int temp = target - nums[i];
?? if(map.containsKey(temp)){
??? return new int[] { map.get(temp), i };
?? }
?? map.put(nums[i],i);
? }
? return null;
?}
7.給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等于目標數。函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小于 index2。
'''
說明:
返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重復使用相同的元素。
示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等于目標數 9 。因此 index1 = 1, index2 = 2 。
## python
class Solution(object):
??? def twoSum(self, numbers, target):
??????? l=0
??????? r=len(numbers)-1
??????? while(l<r):
??????????? if(numbers[l]+numbers[r]== target):
??????????????? return [l+1,r+1]
??????????? if(numbers[l]+numbers[r] <target):
??????????????? l += 1
??????????? else:
??????????????? r -= 1
## 測試用例:
def test_towSum1(self):
??? assert towSum([0,1, 1, 2, 3, 6,8], 2) == [1, 4]
def test_towSum2(self):
??? assert towSum([1,2,5,6,12], 13) == [1, 5]
def test_towSum3(self):
??? assert towSum([2, 7, 11, 15], 9) == [1, 2]
## Java
public int[] twoSum(int[] numbers, int target) {
??????? int left = 0;
??????? int right = numbers.length - 1;
??????? while (left < right) {
??????????? if (numbers[left] + numbers[right] == target) {
??????????????? return new int[]{left + 1, right + 1};
??????????? }
??????????? if (numbers[left] + numbers[right] < target) {
??????????????? left += 1;
??????????? } else {
??????????????? right -= 1;
??????????? }
??????? }
????? ??return null;
??? }
8.假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?注意:給定 n 是一個正整數。
'''
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1.? 1 階 + 1 階
2.? 2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1.? 1 階 + 1 階 + 1 階
2.? 1 階 + 2 階
3.? 2 階 + 1 階
'''
Python
## 不推薦 效率極低 ##
def setpMethod(num):
?? if(n == 1 or n == 2):
??????????? return n
??? else:
??????? return self.setpMethod(num-1)+self.setpMethod(num-2)
## 推薦寫法 ##
??? def climbStairs(self, n):
??????? if(n == 1 or n == 2):
??????????? return n
??????? num1=1
??????? num2=2
??????? while(n >= 3):
??????????? result = num1 + num2
??????????? num1 = num2
??????????? num2 = result
??????????? n -=1
??????? return result
## Java ##
public int setpMethod(int n){
??????? if(n ==1 || n ==2){
??????? return n;
??????? }
??????? int result = 0,n1 = 1,n2 = 2;
??????? while (n>=3){
??????????? result = n1 + n2;
??????????? n1 = n2;
??????????? n2 = result;
??????????? n--;
??????? }
??????? return result;
??? }
9.給定一個非負整數數組,你最初位于數組的第一個位置。
'''
示例 1:
輸入: [2,3,1,1,4]
輸出: true
解釋: 從位置 0 到 1 跳 1 步, 然后跳 3 步到達最后一個位置。
示例 2:
輸入: [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最后一個位置。
'''
## python ##
class Solution(object):
??? def canJump(self, nums):
??????? need = 1
??????? if(len(nums) ==1):
??????????? return True
??????? if(nums[0] == 0):
??????????? return False
??????? for i in range(len(nums)-2,-1,-1):
??????????? if(nums[i] == 0 or nums[i] < need):
??????????????? need += 1
??????????? else:
? ??????????????need = 1
??????? if(need == 1) :
??????????? return True
??????? else:
??????????? return False
## java ##
public boolean canJump(int[] nums) {
??????? int n = 1;
??????? if(nums.length ==1){
??????? return true;
??????? }
??????? if(nums[0] == 0){
??????? return false;
??????? }
??????? for(int i=nums.length-2; i>=0; i--){
??????????? if(nums[i] >= n){
??????????????? n=1;
??????????? }else{
??????????????? n++;
??????????? }
??????? }
??????? if(n == 1){
??????????? return true;
??????? }else{
??????????? return false;
??????? }
??? }
10.以 Unix 風格給出一個文件的絕對路徑,你需要簡化它。或者換句話說,將其轉換為規范路徑。
在 Unix 風格的文件系統中,一個點(.)表示當前目錄本身;此外,兩個點 (…) 表示將目錄切換到上一級(指向父目錄);兩者都可以是復雜相對路徑的組成部分。
更多信息請參閱:Linux / Unix中的絕對路徑 vs 相對路徑.
請注意,返回的規范路徑必須始終以斜杠 / 開頭,并且兩個目錄名之間必須只有一個斜杠 /。最后一個目錄名(如果存在)不能以 / 結尾。此外,規范路徑必須是表示絕對路徑的最短字符串。
示例 1:
輸入:"/home/"
輸出:"/home"
解釋:注意,最后一個目錄名后面沒有斜杠。
示例 2:
輸入:"/../"
輸出:"/"
解釋:從根目錄向上一級是不可行的,因為根是你可以到達的最高級。
示例 3:
輸入:"/home//foo/"
輸出:"/home/foo"
解釋:在規范路徑中,多個連續斜杠需要用一個斜杠替換。
示例 4:
輸入:"/a/./b/../../c/"
輸出:"/c"
示例 5:
輸入:"/a/../../b/../c//.//"
輸出:"/c"
示例 6:
輸入:"/a//bc/d//././/.."
輸出:"/a/b/c"
##python##
def simplifyPath(self, path):
??????? """
??????? :type path: str
??????? :rtype: str
??????? """
??????? paths = path.split('/')
??????? str = ''
??????? pathlist = [i for i in paths if I]
??????? result = []
??????? for j in range(len(pathlist)):
??????????? print(j)
??????????? if(pathlist[j] == ".."):
??????????????? if(result):
?????? ?????????????result.pop()
??????????? elif(pathlist[j] == "."):
??????????????? continue
??????????? else :
??????????????? result.append(pathlist[j])
??????? if not result:
??????????? return '/'
??????? for k in range(len(result)):
??????????? str = str + '/' + result[k]
??????? return str
11.給定一個字符串 (s) 和一個字符模式 § ,實現一個支持 ‘?’ 和 ‘’ 的通配符匹配。’?’ 可以匹配任何單個字符。’’ 可以匹配任意字符串(包括空字符串)。兩個字符串完全匹配才算匹配成功。
說明:
s 可能為空,且只包含從 a-z 的小寫字母。
p 可能為空,且只包含從 a-z 的小寫字母,以及字符 ? 和 *。
示例 1:
輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字符串。
示例 2:
輸入:
s = "aa"
p = "*"
輸出: true
解釋: '*' 可以匹配任意字符串。
示例 3:
輸入:
s = "cb"
p = "?a"
輸出: false
解釋: '?' 可以匹配 'c', 但第二個 'a' 無法匹配 'b'。
示例 4:
輸入:
s = "adceb"
p = "*a*b"
輸出: true
解釋: 第一個 '*' 可以匹配空字符串, 第二個 '*' 可以匹配字符串 "dce".
示例 5:
輸入:
s = "acdcb"
p = "a*c?b"
輸入: false
##python##
def isMatch(self, s, p):
??????? si, pi, pj, sj = 0, 0, -1, -1
??????? while si < len(s):
??????????? if pi < len(p) and p[pi] == '*':
??????????????? pi += 1
??????????????? pj = pi
??????????????? sj = si
??????? ????elif pi < len(p) and (p[pi] == '?' or p[pi] == s[si]):
??????????????? pi += 1
??????????????? si += 1
??????????? elif pj != -1:
??????????????? pi = pj
??????????????? sj += 1
??????????????? si = sj
??????????? else:
??????????????? return False
??????? while (pi < len(p) and p[pi] == '*'):
??????????? pi += 1
??????? return pi == len(p)
12.給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,并且它們的每個節點只能存儲 一位 數字。如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
## python ##
class Solution(object):
??? def addTwoNumbers(self, l1, l2):
??????? n =l1.val + l2.val
??????? l3 = ListNode(n%10)
??????? l3.next = ListNode(n//10)
??????? p1 = l1.next
??? ????p2 = l2.next
??????? p3 = l3
??????? while True:
??????????? if p1 and p2:
??????????????? sum = p1.val+ p2.val + p3.next.val
??????????????? p3.next.val = sum % 10
??????????????? p3.next.next = ListNode(sum//10)
??????????????? p1 = p1.next
???????? ???????p2 = p2.next
??????????????? p3 = p3.next
??????????? elif p1 and not p2:
??????????????? sum = p1.val + p3.next.val
??????????????? p3.next.val = sum %10
??????????????? p3.next.next = ListNode(sum // 10)
??????????????? p1 = p1.next
??????????????? p3 = p3.next
??????????? elif not p1 and p2:
??????????????? sum = p2.val +p3.next.val
??????????????? p3.next.val = sum % 10
??????????????? p3.next.next = ListNode(sum // 10)
??????????????? p2 = p2.next
???? ???????????p3 = p3.next
??????????? else :
??????????????? if p3.next.val == 0:
??????????????????? p3.next = None
??????????????? break
??????? return l3
總結
- 上一篇: 部署DHCP服务器与地址耗尽攻击
- 下一篇: 我的单车游记:向西,向西,到栖霞去(一)