高級軟件測試工程師精華面試題(持續更新中)

前言:此文專門記載本人平時面試以及收藏的面試題目,答案個人填寫及百度的,如果有錯誤之處請及時指正,謝謝!
1、python的數據類型有哪些
答:Python基本數據類型一般分爲:數字、字符串、列表、元組、字典、集合這六種基本數據類型。
浮點型、複數類型、布爾型(布爾型就是隻有兩個值的整型)、這幾種數字類型。列表、元組、字符串都是序列。

2、列表和元組的區別
答:列表是動態的,長度可變,可以隨意地增刪改元素。列表的存儲空間略大於元組,性能略遜於元組。
元組是靜態的,長度大小固定,不可以對元組元素進行增刪改操作。元組對於列表更加輕量級,性能稍優。

3、字典的原理
答:python中的字典底層依靠哈希表(hash table)實現, 使用開放尋址法解決衝突,
哈希表是key-value類型的數據結構, 可以理解爲一個鍵值需要按照一定規則存放的數組, 而哈希函數就是這個規則
字典本質上是一個散列表(總有空白元素的數組, python至少保證1/3的數組是空的), 字典中的每個鍵都佔用一個單元,
一個單元分爲兩部分, 分別是對鍵的引用和對值的引用, 使用hash函數獲得鍵的散列值, 散列值對數組長度取餘, 取得的值就是存放位置的索引
哈希衝突(數組的索引相同), 使用開放尋址法解決
這也是python中要求字典的key必須可hash的原因
數組中1/3的位置爲空, 增加元素可能會導致擴容, 引發新的散列衝突, 導致新的散列表中鍵的次序發生變化, 這也是字典遍歷時不能添加和刪除的原因
字典在內存中開銷很大, 實際上是以空間換時間

4、說一下hash算法與哈希衝突
答:哈希算法:根據設定的哈希函數H(key)和處理衝突方法將一組關鍵字映象到一個有限的地址區間上的算法。也稱爲散列算法、雜湊算法。
哈希表:數據經過哈希算法之後得到的集合。這樣關鍵字和數據在集合中的位置存在一定的關係,可以根據這種關係快速查詢。
非哈希表:與哈希表相對應,集合中的 數據和其存放位置沒任何關聯關係的集合。
由此可見,哈希算法是一種特殊的算法,能將任意數據散列後映射到有限的空間上,通常計算機軟件中用作快速查找或加密使用。
哈希衝突:由於哈希算法被計算的數據是無限的,而計算後的結果範圍有限,因此總會存在不同的數據經過計算後得到的值相同,這就是哈希衝突。

5、怎麼解決哈希衝突
答:解決哈希衝突的方法一般有:開放定址法、鏈地址法(拉鍊法)、再哈希法、建立公共溢出區等方法。(https://www.cnblogs.com/zyyhxbs/p/12408604.html)
6、說下python的內存管理和垃圾回收機制

答:python的內存管理機制有三種:引用計數、垃圾回收、內存池。
引用計數:引用計數是一種非常高效的內存管理手段,當一個pyhton對象被引用時其引用計數增加1,當其不再被引用時引用計數減1,當引用計數等於0的時候,對象就被刪除了
垃圾回收:引用計數、標記清除、分代回收
內存池:Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。
Python中所有小於256個字節的對象都使用pymalloc實現的分配器,而大的對象則使用系統的 malloc。
另外Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。
也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。

7、內存過大時你有什麼調優手段
答:1.手動垃圾回收 2.避免循環引用(手動解循環引用和使用弱引用)3.調高垃圾回收閾值

8、請簡述下python的拷貝
答:1.賦值: 只是複製了新對象的引用,不會開闢新的內存空間。
2.淺拷貝: 創建新對象,其內容是原對象的引用。
淺拷貝有三種形式:切片操作,工廠函數,copy模塊中的copy函數。
如: lst = [1,2,3,[4,5]]
切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst] 要注意:list1=lst 和list1=lst[:]的區別
工廠函數:lst1 = list(lst)
copy函數:lst1 = copy.copy(lst)
淺拷貝之所以稱爲淺拷貝,是它僅僅只拷貝了一層,在lst中有一個嵌套的list[4,5],如果我們修改了它,情況就不一樣了。
3.深拷貝:只有一種形式,copy模塊中的deepcopy函數。
和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。
深拷貝出來的對象是一個全新的對象,不再與原來的對象有任何關聯。
#說明如下:
#1.外層添加元素時, 淺拷貝c不會隨原列表a變化而變化;內層list添加元素時,淺拷貝c纔會變化。
#2.無論原列表a如何變化,深拷貝d都保持不變。
#3.賦值對象隨着原列表一起變化

9、請講一下協程的原理
答:我自己暫時也不清楚,還沒有自己的理解,資料如下:
運用協程機制最典型的場景就是異步IO。所謂異步,是指一段程序在執行完成前有能力“暫停”,讓其他程序段執行。
從語法上來看,協程和生成器類似,都是定義體中包含yield關鍵字的函數,所以總體上在協程中把yield看做是控制流程的方式。
協程是一個特殊的生成器,yield有返回值>生成器,yield沒有>協程(沒返回值就是協程)
(https://www.cnblogs.com/ajianbeyourself/p/11261302.html、https://www.cnblogs.com/yc3110/p/10443108.html)

10、數據庫的事務是什麼
答:數據庫事務是指一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱爲 ACID(原子性、一致性、隔離性和持久性)屬性
(https://www.cnblogs.com/chaojiyingxiong/p/11029406.html、https://blog.csdn.net/x_i_xw/article/details/81408656)

11、sql的多表聯查方式
答:內連接:JOIN / INNER JOIN、不等連接:ON 子句中使用了不等於運算符、自連接:一張表連接自身、左(外)連接:LEFT JOIN / LEFT OUTER JOIN、
右(外)連接:RIGHT JOIN / RIGHT OUTER JOIN、全(外)連接:FULL JOIN / FULL OUTER JOIN、交叉連接:CROSS JOIN (可用","代替)、
UNION 、UNION ALL操作符用於合併兩個或多個 SELECT 語句的結果集。

12、數據庫的存儲過程
答:一組爲了完成特定功能的SQL語句集(或者自定義數據庫操作命令集), 根據傳入的參數(也可以沒有),
通過簡單的調用, 完成比單個SQL語句更復雜的功能, 存儲在數據庫服務器端,只需要編譯過一次之後再次使用都不需要再進行編譯:主要對存儲的過程進行控制
(https://www.runoob.com/w3cnote/mysql-stored-procedure.html)

13、數據庫的存儲過程與事務的異同
答:事務是保證多個SQL語句的原子型的,也就是要麼一起完成,要麼一起不完成
存儲過程是把一批SQL語句預編譯後放在服務器上,然後可以遠程調用
(https://www.jb51.net/article/158051.htm)

14、cookie與session的區別是什麼
答:(1)Cookie以文本文件格式存儲在瀏覽器中,而session存儲在服務端它存儲了限制數據量。它只允許4kb它沒有在cookie中保存多個變量。
(2)cookie的存儲限制了數據量,只允許4KB,而session是無限量的
(3)我們可以輕鬆訪問cookie值但是我們無法輕鬆訪問會話值,因此它更安全
(4)設置cookie時間可以使cookie過期。但是使用session-destory(),我們將會銷燬會話。
(https://baijiahao.baidu.com/s?id=1619095369231494766&wfr=spider&for=pc)

15、項目中能不能只使用SESSION,不使用COOKIE
答:可以,通過重定向的形式,把session id放在url後面,但是這樣做直接將把session id暴露出來了,於安全考慮不建議使用這樣的方式
(https://blog.csdn.net/weixin_40648117/article/details/78844100)

16、http和https的區別
答:1、https協議需要到CA (Certificate Authority,證書頒發機構)申請證書,一般免費證書較少,因而需要一定費用。(原來網易官網是http,而網易郵箱是https。)
2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
4、http的連接很簡單,是無狀態的。Https協議是由SSL+Http協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
(無狀態的意思是其數據包的發送、傳輸和接收都是相互獨立的。無連接的意思是指通信雙方都不長久的維持對方的任何信息。)
(https://blog.csdn.net/guolin_blog/article/details/104546558、https://blog.csdn.net/qq_38289815/article/details/80969419)

17、https是非對稱加密還是對稱加密
答:Https的加密機制是一種共享密鑰加密和公開密鑰加密並用的混合加密機制。
握手前使用非對稱加密,連接後使用對稱加密,因爲僅使用非對稱加密的話,會影響數據的傳輸效率
(https://blog.csdn.net/jiangshangchunjiezi/article/details/88545263)

18、啓動shell腳本的方式
答:1、工作目錄執行,指的是執行腳本時,先進入到腳本所在的目錄(此時,稱爲工作目錄),然後使用 ./腳本方式執行
2、絕對路徑中執行,指的是直接從根目錄/到腳本目錄的絕對路徑
3、sh執行,指的是用腳本對應的sh或bash來接着腳本執行
4、shell環境執行,指的是在當前的shell環境中執行,可以使用 . 接腳本 或 source 接腳本
(https://www.jb51.net/article/161001.htm)

19、SQL與ORM的優缺點
答:相對來說,ORM的缺點就是SQL的優勢地方,而優點也是SQL的劣勢地方。
優點
方便的使用面向對象,語句清晰
防注入『這個其實不算ORM的核心,因爲比如Phalcon的SQL形式寫法也可以防注入』
方便動態構造語句,對於不同的表的相同操作採用多態實現更優雅
一定程度方便重構數據層『比如改表名,字段名等』
設置鉤子函數
缺點
不太容易處理複雜查詢語句
性能較直接用SQL差
(https://blog.csdn.net/qq_35443962/article/details/80361987)

20、請講一下生產者消費者模型
答:生產者消費者模型設計要合理,如果生產者慢了,可以增加生產者,消費者慢了,增加消費者;

實際應用中,生產者,消費者可能是兩套不同的系統,不會存在於一個進程裏,甚至不在同一臺設備上;而queue.Queue只能用於線程間通訊,那麼該怎麼辦呢?

採用消息隊列,比如rabbitMQ;

最後,上傳一篇將進程線程做了很好的類比的一篇文章

  • 計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在運行。

  • 假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背後的含義就是,單個CPU一次只能運行一個任務。

  • 進程就好比工廠的車間,它代表CPU所能處理的單個任務。任一時刻,CPU總是運行一個進程,其他進程處於非運行狀態。

  • 一個車間裏,可以有很多工人。他們協同完成一個任務。

  • 線程就好比車間裏的工人。一個進程可以包括多個線程。

  • 車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象徵一個進程的內存空間是共享的,每個線程都可以使用這些共享內存。

  • 可是,每間房間的大小不同,有些房間最多隻能容納一個人,比如廁所。裏面有人的時候,其他人就不能進去了。這代表一個線程使用某些共享內存時,其他線程必須等它結束,才能使用這一塊內存。

  • 一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫“互斥鎖”(Mutual exclusion,縮寫 Mutex),防止多個線程同時讀寫某一塊內存區域。

  • 還有些房間,可以同時容納n個人,比如廚房。也就是說,如果人數大於n,多出來的人只能在外面等着。這好比某些內存區域,只能供給固定數目的線程使用。這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。後到的人發現鑰匙架空了,就知道必須在門口排隊等着了。這種做法叫做“信號量”(Semaphore),用來保證多個線程不會互相沖突。

  • 不難看出,mutex是semaphore的一種特殊情況(n=1時)。也就是說,完全可以用後者替代前者。但是,因爲mutex較爲簡單,且效率高,所以在必須保證資源獨佔的情況下,還是採用這種設計。

  • 操作系統的設計,因此可以歸結爲三點:

(1)以多進程形式,允許多個任務同時運行;

(2)以多線程形式,允許單個任務分成不同的部分運行;

(3)提供協調機制,一方面防止進程之間和線程之間產生衝突,另一方面允許進程之間和線程之間共享資源。
(https://www.cnblogs.com/deeper/p/7730203.html)
21、待更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章