軟件測試面試題匯總(一)

1.Java中==和equal有什么區別

==比較的是對象的地址,也就是是否是同一個對象;

equal比較的是對象的值。

例如:


Integer r1 = newInteger(900);//定義r1整型對象

Integer r2 = newInteger(900);//定義r2整型對象

System.out.println(r1==r2);//返回false

System.out.println(r1.equal(r2));//返回true

2.jmeter如何對登錄進行壓測,在一個時間段內達到一定數量的用戶

線程啟動了就會直接發送測試請求。

如果要模擬在一瞬間高并發量測試的時候,需要調高線程數量,這很耗測試機器的性能,往往無法支持較大的并發數,無法控制每次測試的瞬間并發量。

解決:使用集合點;

作用:阻塞線程,直到指定的線程數量到達后,再一起釋放,可以瞬間產生很大的壓力。

詳細操作可參見:Jmeter使用集合點,模擬達到指定的線程數后高并發測試

3.spring的Aop原理,具體使用

就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。

AOP把軟件系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處都基本相似。比如權限認證、日志、事務處理。Aop 的作用在于分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。

AOP用來封裝橫切關注點,具體可以在下面的場景中使用:

Authentication 權限

Caching 緩存

Context passing 內容傳遞

Error handling 錯誤處理

Lazy loading 懶加載

Debugging  調試

logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準

Performance optimization 性能優化

Persistence  持久化

Resource pooling 資源池

Synchronization 同步

Transactions 事務

可參考:https://segmentfault.com/a/1190000009165134

4.get和post的區別

相同點

都是向服務器發送請求:Get是向服務器發送索取數據的一種請求,而Post是向服務器提交數據的一種請求

不同點

(1)、請求的數據

GET請求,請求的數據會附加在URL之后,以?分割URL和傳輸數據,多個參數用&連接。URL的編碼格式采用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之后再傳輸。

POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。

因此,GET請求的數據會暴露在地址欄中,而POST請求則不會。

(2)、用途

GET用于從服務器端獲取數據,包括靜態資源(HTML|JS|CSS|Image等等)、動態數據展示(列表數據、詳情數據等等)。

POST用于向服務器提交數據,比如增刪改數據,提交一個表單新建一個用戶、或修改一個用戶等。

(3)、緩存

GET時默認可以復用前面的請求數據作為緩存結果返回,此時以完整的URL作為緩存數據的KEY。所以有時候為了強制每次請求都是新數據,可以在URL后面加上一個隨機參數Math.random或時間戳new Date().getTime()、或版本號,比如abc.com?a=1&rnd=0.123987之類的。這也是目前一些靜態資源后面加一個很長的版本號的原因,jquery-min.js?v=13877770表示一個版本,當頁面引用jquery-min.js?v=13877771時瀏覽器必然會重新去服務器請求這個資源。jQuery.ajax方法,如果cache=false,則會在GET請求參數中附加”_={timestamp}”來禁用緩存。

POST一般則不會被這些緩存因素影響。

(4)、安全性

默認對于nginx的access log,會自動記錄get或post的完整URL,包括其中帶的參數。

對于POST來說,請求的報文卻不會被記錄,這些對于敏感數據來說,POST更安全一些。

(5)、Url長度限制

GET是通過URL提交數據,因此GET可提交的數據量就跟URL所能達到的最大長度有直接關系。

HTTP協議本身對GET和POST都沒有對長度的限制,而對于URL長度上的限制是瀏覽器受服務器的配置限制或者內存的大小。

(6)、冪等

GET冪等,POST不冪等

冪等是指同一個請求方法執行多次和僅執行一次的效果完全相同。

引入冪等主要是為了處理同一個請求重復發送的情況,比如在請求響應前失去連接,如果方法是冪等的,就可以放心地重發一次請求。這也是瀏覽器在后退/刷新時遇到POST會給用戶提示的原因:POST語義不是冪等的,重復請求可能會帶來意想不到的后果。

比如在微博這個場景里,GET的語義會被用在「看看我的Timeline上最新的20條微博」這樣的場景,而POST的語義會被用在「發微博、評論、點贊」這樣的場景中。

5.jmeter壓力測試注冊,參數化如何保證id不重復

1).使用UUID,JMeter函數助手給大家提供了一個UUID()函數,UUID來生成一個附機字符串。


import java.util.UUID;

UUID uuid1 = UUID.randomUUID(); //獲取UID的值

vars.put("order_id",(uuid1.toString()).toUpperCase().replaceAll("-",""));  

 //去掉UUID的“-”,再賦值給order_id  運行獲取的參數就是:3F2504E04F8911D39A0C0305E82C3301

2)、用__RandonString()與__time()組合

只要TPS足夠大還是可能會有重復現象的

3)、使用多個函數組合:{time}+{group}+{thread number}+{迭代計數}

group獲取:JMeter的線程組可以通過ctx來獲取,線程組是類似這樣的格式:線程組 1-1

使用BeanShell Sampler,${__BeanShell(((ctx.getThread().getThreadName().toString()).split(" ")[1]).split("-")[0],group)},并把線程組的Id放到了group中

image

thread number獲取:可以通過__threadNum獲取

time獲取:通過__time(hhmmss,)獲取,可以指定輸出格式,這里只輸出時分秒

迭代計數器獲取:通過__counter獲取

合在一起:${__time(hhmmss,)}${group}${__threadNum}${__counter(,)}

6.Oracle中varchar2的最大長度

最大長度為4000

7.Linux中強制殺死進程的命令

首先,用ps查看進程:$ ps -ef 或者:$ ps -aux

拿到進程的PID后,執行:$ kill -s 9 1827

其中-s 9 制定了傳遞給進程的信號是9,即強制、盡快終止進程。

1827則是上面ps查到的某個進程的PID。

8.棧的特點

棧是一種數據結構,它按照先進后出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據被第一個讀出來)。

1),先進后出 (好比高高的蒸籠一層一層的,放在最下面的蒸籠的包子最后才能拿出來),比如進123,出321

2),具有記憶功能,棧的特點是先進棧的后出棧,后進棧的先出棧,所以你對一個棧進行出棧操作,出來的元素肯定是你最后存入棧中的元素,所以棧有記憶功能。

3),對棧的插入與刪除操作中,不需要改變棧底指針。

4),棧可以使用順序存儲也可以使用鏈式存儲,棧也是線性表,因此線性表的存儲結構對棧也適用

線性表可以鏈式存儲。

9.Jenkins發布版本前,需要設置哪些參數

安裝必要的插件:如搜索下載以下插件(Maven Integration plugin 、Publish Over SSH、Deploy to container Plugin)

全局工具配置,配置 jdk、git、maven、tomcat

配置服務器參數及git相關參數。

image

構建項目,點擊新建,然后構建一個maven項目.

10.app自動化,啟動driver需要設置哪些參數

DesiredCapabilities capabilities = new DesiredCapabilities();

capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "Selendroid");

capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");

capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "2.3");

capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");

capabilities.setCapability(MobileCapabilityType.APP, myApp);

capabilities.setCapability(MobileCapabilityType.APP_PACKAGE: "com.mycompany.package");

capabilities.setCapability(MobileCapabilityType.APP_ACTIVITY: ".MainActivity");

|platformName|你要測試的手機操作系統|iOS, Android, 或 FirefoxOS|

|platformVersion|手機操作系統版本|例如: 7.1, 4.4|

|appPackage| 你想運行的Android應用的包名|比如com.example.android.myApp, com.android.settings|

|appActivity| 你要從你的應用包中啟動的 Android Activity 名稱。它通常需要在前面添加 . (如:使用.MainActivity 而不是 MainActivity) |MainActivity, .Settings|

|app|.ipa or .apk文件所在的本地絕對路徑或者遠程路徑,也可以是一個包括兩者之一的.zip。 Appium會先嘗試安裝路徑對應的應用在適當的真機或模擬器上。針對Android系統,如果你指定app-packageapp-activity(具體見下面)的話,那么就可以不指定app會與 browserName 沖突 |比如/abs/path/to/my.apkhttp://myapp.com/app.ipa|

11.登錄功能,有哪些方式可以保證安全性
12.sql 計算每個員工的總分并排名
13.已上線的項目,如何監控

使用一些開源的工具

14.hashmap,hashtree,hashlink的區別

Map map = new TreeMap();

//TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好

Map map = new LinkedHashMap();

//LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現,它還可以按讀取順序來排列.

Map map = new HashMap();

//HashMap里面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。

15.UI自動化主要適用于哪些情況

1)、操作過程完全機械的,即測試人員不必用腦子。

2)、每次的操作行為經常是重復上一次的動作。

3)、經常要進行的測試活動。

4)、該場景完全幾乎不會或者極少會改動。

16.使用selenium自動化,用什么工具管理測試用例

testng

17.接口測試用例場景如何設計

接口測試用例場景

18.給一個網站設計性能測試方案

獲取用戶數信息、獲取業務數據量、場景業務的調查、與性能指標指標相關的調查

可參考:https://www.cnblogs.com/mxqh2016/p/6385860.html

19.鎖的機制,如何避免并發

多線程并發解決方案(原子變量的使用)

20.悲觀鎖,樂觀鎖的使用有哪些?有何區別

Java 中的悲觀鎖和樂觀鎖的實現

21.線程池的安全

線程的三種實現方式:

1)、 Thread類,可extends

2)、 Runable接口,需要實現run方法,通過new Thread類調用

3)、 callable接口,需要實現call方法,通過 FutureTask 調用,并獲取返回值,可結合線程池使用。

四類線程池

newCachedThreadPool

創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。

這種類型的線程池特點是:

工作線程的創建數量幾乎沒有限制(其實也有限制的,數目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。

如果長時間沒有往線程池中提交任務,即如果工作線程空閑了指定的時間(默認為1分鐘),則該工作線程將自動終止。終止后,如果你又提交了新的任務,則線程池重新創建一個工作線程。

在使用CachedThreadPool時,一定要注意控制任務的數量,否則,由于大量線程同時運行,很有會造成系統癱瘓。

newFixedThreadPool

創建一個指定工作線程數量的線程池。每當提交一個任務就創建一個工作線程,如果工作線程數量達到線程池初始的最大數,則將提交的任務存入到池隊列中。

FixedThreadPool是一個典型且優秀的線程池,它具有線程池提高程序效率和節省創建線程時所耗的開銷的優點。但是,在線程池空閑時,即線程池中沒有可運行任務時,它不會釋放工作線程,還會占用一定的系統資源。

newSingleThreadExecutor

創建一個單線程化的Executor,即只創建唯一的工作者線程來執行任務,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。如果這個線程異常結束,會有另一個取代它,保證順序執行。單工作線程最大的特點是可保證順序地執行各個任務,并且在任意給定的時間不會有多個線程是活動的。

newScheduleThreadPool

創建一個定長的線程池,而且支持定時的以及周期性的任務執行,支持定時及周期性任務執行。

21.selenium具體如何啟動webdriver

以firefox為例。

當測試腳本啟動firefox的時候,selenium-webdriver 會首先在新線程中啟動firefox瀏覽器。如果測試腳本指定了firefox的profile,那么就以該profile啟動,否則的話就新啟1個profile,并啟動firefox;

firefox一般是以-no-remote的方法啟動,啟動后selenium-webdriver會將firefox綁定到特定的端口,綁定完成后該firefox實例便作為webdriver的remote server存在;

客戶端(也就是測試腳本)創建1個session,在該session中通過http請求向remote server發送restful的請求,remote server解析請求,完成相應操作并返回response;

客戶端接受response,并分析其返回值以決定是轉到第3步還是結束腳本;

image
22.selenium自動化框架設計模式

selenium目前比較流行的設計模式就是page object,那么到底什么是page object呢,簡單來說,就是把頁面作為對象,在使用中傳遞頁面對象,來使用頁面對象中相應的成員或者方法,能更好的提現java的面向對象和封裝特性。而使用時間長了會發現該模式也存在一點問題,那就是元素每次都要獲取,并且獲取元素與頁面方法不分離,增加代碼冗余度,用過springMVC框架的人都知道,注解方式的開發會大大增加開發效率,使頁面變得整潔。

什么是pageFactory 設計模式呢?

準確來說就是在page object模式基礎上更好的利用了面向對象的思維,將獲取元素與操作頁面的方法進行分離,以前獲取元素要findelementbyid等等,現在只要一個注解就可以搞定,并且再次跑自動化回歸測試時候,代碼有獲取緩存的特性,所以會比第一次跑的快,只要id,name不變。

23.安卓和iOS有什么區別

1.android是google公司做的手機系統,ios是蘋果公司做的手機系統。

2.android手機系統的手機很多廠家公司在做如HTC,三星,中興等等。。。 ios只有蘋果公司的手機和數碼產品才會是ios的手機系統。

3.android手機系統和ios軟件開發工具不同,平臺不同。軟件也不用,所以兩個兩個平臺的軟件不能通用,但是好的軟件都會有兩個系統版本,如QQ 有IOS版也是就iphoneQQ,和android版QQ。

4.安卓手機完全開源,任何軟件開發商或者個人都能開發安卓的軟件。蘋果IOS完全封源開發

正是由于開源和各個品牌手機硬件差異極大,導致安卓手機的系統體驗各有差異,軟件兼容性也不如IOS。所以安卓手機總體的系統體驗,流暢度,軟件兼容性,明顯不如系統和軟件開發都對硬件有極其針對性的IOS,軟件數量也不如IOS,游戲數量也不如IOS,而且很多高質量軟件,特別是游戲都是先出現在IOS上。

.安卓系統的軟件幾乎都是免費,而IOS的軟件和游戲,好的基本都付費,當然蘋果可以越獄,越獄后也是免費使用。

安卓手機支持FLASH,可以玩QQ農場,不過需要高端安卓機2.2以上系統才支持。IOS不支持FLASH,只支持HTML5,所以蘋果上不能看FLASH,甚至蘋果有時候連HTML5的視頻兼容性也不好。

安卓手機使用起來上手快,下載歌曲電影等直接放到手機里就能看,IOS則需要同步到手機中,不過越獄后也能直接放到手機里看。

24.使用jmeter如何進行混合場景的壓測
25.項目周期短,迭代頻繁,使用什么開發流程比較敏捷

什么是Sprint?

Sprint是短距離賽跑的意思,這里面指的是一次迭代,而一次迭代的周期是1個月時間(即4個星期),也就是我們要把一次迭代的開發內容以最快的速度完成它,這個過程我們稱它為Sprint。

如何進行Scrum開發?

1、我們首先需要確定一個Product Backlog(按優先順序排列的一個產品需求列表),這個是由Product Owner 負責的;

2、Scrum Team根據Product Backlog列表,做工作量的預估和安排;

3、有了Product Backlog列表,我們需要通過 Sprint Planning Meeting(Sprint計劃會議) 來從中挑選出一個Story作為本次迭代完成的目標,這個目標的時間周期是1~4個星期,然后把這個Story進行細化,形成一個Sprint Backlog;

4、Sprint Backlog是由Scrum Team去完成的,每個成員根據Sprint Backlog再細化成更小的任務(細到每個任務的工作量在2天內能完成);

5、在Scrum Team完成計劃會議上選出的Sprint Backlog過程中,需要進行 Daily Scrum Meeting(每日站立會議),每次會議控制在15分鐘左右,每個人都必須發言,并且要向所有成員當面匯報你昨天完成了什么,并且向所有成員承諾你今天要完成什么,同時遇到不能解決的問題也可以提出,每個人回答完成后,要走到黑板前更新自己的 Sprint burn down(Sprint燃盡圖);

6、做到每日集成,也就是每天都要有一個可以成功編譯、并且可以演示的版本;很多人可能還沒有用過自動化的每日集成,其實TFS就有這個功能,它可以支持每次有成員進行簽入操作的時候,在服務器上自動獲取最新版本,然后在服務器中編譯,如果通過則馬上再執行單元測試代碼,如果也全部通過,則將該版本發布,這時一次正式的簽入操作才保存到TFS中,中間有任何失敗,都會用郵件通知項目管理人員;

7、當一個Story完成,也就是Sprint Backlog被完成,也就表示一次Sprint完成,這時,我們要進行 Srpint Review Meeting(演示會議),也稱為評審會議,產品負責人和客戶都要參加(最好本公司老板也參加),每一個Scrum Team的成員都要向他們演示自己完成的軟件產品(這個會議非常重要,一定不能取消);

8、最后就是 Sprint Retrospective Meeting(回顧會議),也稱為總結會議,以輪流發言方式進行,每個人都要發言,總結并討論改進的地方,放入下一輪Sprint的產品需求中;

image
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 注:此文章來源:Job_Yang 的簡書 1. Object-c的類可以多重繼承么?可以實現多個接口么?Categ...
    廣益散人閱讀 1,360評論 0 13
  • 之前看了很多面試題,感覺要不是不夠就是過于冗余,于是我將網上的一些面試題進行了刪減和重排,現在分享給大家。(題...
    Job_Yang閱讀 12,109評論 12 143
  • 1.weak和assign區別 修飾變量類型的區別: weak 只可以修飾對象。如果修飾基本數據類型,編譯器會報錯...
    coderjon閱讀 1,039評論 0 1
  • 昨天是二月二,龍抬頭。晚上下班的時候接到奶奶的電話,于是看了看公交車的車頂,算是象征性地抬了一下頭。最近有些忙,忙...
    老瑯閱讀 103評論 0 0
  • emmmm,真的很簡單,一切交給電飯鍋就行了,簡單到蘑菇都不知道怎么寫這個菜譜_(:з」∠)_ ...
    蘑菇君dh閱讀 331評論 1 0