測試面試題總結

1.自我介紹和介紹

這一般是面試的第一個問題,記住每個人的簡歷都不一樣,但是jd只有一份。所以要研究這個崗位的jd,再來定制自我介紹,去掉無關的,強調相關的,著重突出能給你加分的。所以一般都有這個套路:

  1. 先介紹自己的學校和公司,現在一般看本科和上一家公司,如果都不好,可能簡歷關都過不了。
    a. 如果你學校讓你驕傲的話,先介紹下你的學校和專業
    b. 如果學校不行的話,直接介紹你工作過的公司,挑有名和相關的說
  2. 簡單說說你在公司負責的項目和你的職責,不用細說,因為后面面試肯定會詳細問。
  3. 說下對這個職位的了解和興趣
    注意一定要簡單,到位,達意,一切都是為了這個崗位做的自我介紹。

2、介紹下你負責的公司項目

  1. 首先你要給人家介紹清楚,你這個項目的產品是什么?話不要多,比如我們的產品是直播應用,市場上競品是什么,這里說個top 1的,然后說下特色是什么,如果知道用戶數據也可以說下。
  2. 接著,講下項目產品有幾個端,服務端,客戶端,安卓,ios。簡單說下,如果面試者還有興趣,你可以把技術架構說一下,這個挺難的。得好好看看自己產品。
  3. 一般到這里,面試官會問,你在項目中干嘛了。那你就要說你在項目中承擔的角色,是測試總控,還是某個模塊負責人。如果是總控就要說說你的測試計劃和測試策略,如果負責測試模塊的,就要說說是哪些模塊。這些模塊的作用是什么?4. 最后,說說你取得的成績。

3、如果項目周期很短,測試人力匱乏,你是怎么協調的?

  1. 測試有壓力,開發必然有壓力,和開發一起砍需求
  2. 系分和測分增加投入,做更精準的測試
  3. 測試提前進入
  4. 加強開發自測,拉取開發交付用例
  5. 加班

4、描述下你團隊的測試分工

  1. 業務壓力大的時候,業務為主,技術為輔
  2. 業務少的時候,技術為主,業務也不丟
  3. 老人帶新人,新人幫老人,選出業務領頭人和技術領頭人,形成團隊梯隊
5、使用什么測試框架做的上一個項目的自動化測試

testng

6、自己最熟悉哪個庫,如何使用這些庫的,是否做了基于復用的封裝,怎么考慮的這些封裝

分別封裝了基礎類例如:等待某元素出現的方法,更方便查找操作元素的方法,和被測試業務相關的類和方法

7.如何使用xpath定位一個兄弟元素,就是和該元素同屬于一個父親節點的元素

答: 先找到父親元素,再找到自己的兄弟元素

8、自動化遇到用例fail掉如何排查故障

答:手工查應用是否真的有bug, 確認不是bug,是不是新版本引入了新的變更,調試腳本看看自己的腳本是不是因為沒有等待元素出現后就操作了,是不是元素上面有其他元素出現這樣操作是不是操作了其他的元素上了

9、等待元素出現的這個方法如何實現的

等待方式有三種:
1)顯示等待:顯示等待,就是明確的要等到某個元素的出現,等不到就一直等,除非在規定的時間之內都沒找到,那么就跳出Exception,代碼,element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement"))
2)隱式等待:就是在創建driver時,為瀏覽器對象創建一個等待時間,這個方法是得不到某個元素就等待一段時間,直到拿到某個元素位置3)線程暫停:Thread.sleep();這種等待屬于死等,很容易讓線程掛掉,使程序拋異常

用一個循環間隔時間去檢查這個元素是否可見
自己封裝的軟等待類軟waitElementIsEnabledBy
使用 WebDriverWait.until,20秒等待到了元素直接執行,沒有就循環等待,20秒等待不到就拋出異常

public static Boolean waitElementIsEnabledBy(By by) {
        try {
            WebDriver waitDriver = driver;
            long waitTime = 20;
            waitDriver.manage().timeouts().implicitlyWait(waitTime, TimeUnit.SECONDS);
            (new WebDriverWait(waitDriver, waitTime)).until(ExpectedConditions.elementToBeClickable(by));
            return true;
        } catch (Exception e) {
            return false;
        }
    }

10、在selenium自動化測試中,你一般完成什么類型的測試?

用于回歸測試。每次迭代都會執行一次回歸

11、你什么時候不自動化測試?

① 人們不應該在以下情況下自動化
② 當受測試的應用程序頻繁更改時
③ 一次測試案例
④ 臨時 - 隨機測試

12、你如何從Selenium連接到數據庫?

Selenium是一個Web UI自動化工具。它不提供任何API來建立數據庫連接。
我們需要jdbcjar包,然后使用Connection對象來連接數據庫并執行sql

13、XPath中使用單斜杠和雙斜杠有什么區別?

1)如果XPath是從文檔節點開始,它將允許創建“絕對”路徑表達式。
例如 “/ html / body / p”匹配所有的段落元素。
2)如果XPath在文檔中的任意位置開始進行選擇匹配,那么它將允許創建“相對”路徑表達式。
例如 “// p”匹配所有的段落元素。

Selenium中可以用哪些驗證點?

Selenium最主要有三種驗證點 -
檢查頁面標題
檢查某些文字
檢查某些元素(文本框,下拉菜單,表、 元素是否出現 、是否可點擊 、是否消失等)

14、在selenium中處理多個彈出窗口的機制是什么?

可以使用命令getWindowHandles()來處理多個彈出窗口。
然后將所有窗口名稱存儲到Set變量中并將其轉換為數組。
接下來,通過使用數組索引,導航到特定的窗口。
driver.switchTo().window(ArrayIndex);

15、你如何處理使用Selenium的Ajax控件?

處理這樣的控件,需要在文本框中輸入值之后,捕獲字符串中的所有建議值;然后,分割字符串,取值就好了。

16、你將如何處理Selenium WebDriver中的警報/彈出窗口?

有兩種類型的警報通常被引用。
基于Windows的警報彈出窗口
基于Web的警報彈出窗口

  • 基于Web的警報彈出窗口。
    WebDriver為用戶提供了一種使用Alert界面處理這些彈出窗口的非常有效的方法。
    1)void dismiss() - 一旦出現彈出窗口,dismiss()方法就會點擊“Cancel”按鈕。
    2)void accept() - 只要彈出窗口出現,accept()方法就會點擊“Ok”按鈕。
    3)String getText() - getText()方法返回警告框中顯示的文本。
    4)void sendKeys(String stringToSend) - sendKeys()方法將指定的字符串模式輸入到警告框中。
  • 基于Windows的警報彈出窗口。
    處理基于windows的彈出窗口總是有點棘手,因為我們知道Selenium是一個自動化測試工具,它只支持Web應用程序測試,也就是說,它不支持基于Windows的應用程序,窗口警報就是其中之一。
    Robot class是基于Java的實用程序,它模擬鍵盤和鼠標操作,并可以有效地用于處理基于windows的彈出與鍵盤事件的幫助。
    KeyPress和KkeyRelease方法可以分別模擬用戶按下和釋放鍵盤上某個鍵的操作。

17、Selenium WebDriver中的可用定位器是什么?

1)ID,
2)Name,名稱
3)CSS,
4)XPath,
5)Class name,
6)TagName,
7)LinkText, 鏈接文本
8)Partial Link Text.部分鏈接文本

18、解釋使用TestNG而不是JUnit框架的好處?

TestNG相較于Junit的優勢:
1)在JUnit中,我們必須聲明@BeforeClass和@AfterClass,這是JUnit中的一個約束,而在TestNG中沒有像這樣的約束。
2)TestNG提供了更多的setUp / tearDown級別。1.@ Before/AfterSuite 2.@Before/AfterTest 3.@Before/AfterGroup
3)TestNG中不需要擴展任何類。
4)TestNG中沒有方法名稱約束,就像JUnit一樣。
5)在TestNG中,我們可以告訴測試一個方法依賴于另一個方法,而在JUnit中這是不可能的。
6)測試用例的分組在TestNG中可用,而JUnit中則不可用。執行可以基于組完成。例如,如果你已經定義了許多案例,并通過將2個組分別定義為“離職“與”回歸”隔離。如果你只是想執行“理智”的情況,那就告訴TestNG執行“理智”。TestNG將自動執行屬于“離職”組的案例。
7)另外,TestNG支持并行測試用例執行。

19、可以使用TestNG運行一組測試用例嗎?

是的,TestNG框架支持在測試組的幫助下執行多個測試用例。
它提供了以下選項來運行特定組中的測試用例。
如果想基于回歸測試或冒煙測試等其中一個組來執行測試用例,那么:
@Test(groups = {“regression-tests”, “smoke-tests”})

20、常見控件使用


1) link/button:
element.click()
注:ajax不能使用clickAndWait()函數,因為cickAndWait函數會在click之后等待頁面重新加載完成,而ajax是部分刷新,所以這個頁面不能重新加載完成。
2) Textbox:
element.send_keys(‘test’)
3) Upload
Driver.find_element_by_id(‘id’).send_keys(‘D\test.txt’)
4) Mouse Event:
e1=driver.find_element_by_id(‘kw’)
ActionChains(driver).double_click()/.context_click()/.drag_and_drop()/.move_to_element()/.perform()  
 # 雙擊/右擊/拖動/懸停/執行actionChains中的行為
5) Dropdown:
·<Select>標簽的下拉菜單
from selenium.webdriver.support.ui import Select
Select(driver.find_element_by_id(‘gender’)).select_by_index(1)
Select(driver.find_element_by_id(‘gender’)).select_by_value(“2”)
Select(driver.find_element_by_id(‘gender’)).select_by_visible_text(“Male”)
·非<Select>標簽的下拉菜單
Dropdown1 = driver.find_element_by_id(‘id’) #先定位到dropdown
Dropdown1.find_element_by_id(“li2_input_2”) #再定位到dropdown中的值
6) Alert:
driver.switch_to.alert.accept()//接受
driver.switch_to.alert.dismiss() //取消
Message=driver.switch_to.alert.text  //獲取彈窗的文本消息
driver.switch_to.alert.send_keys(‘hello’) //輸入值,這個在alert和confirm中不可用
7) Window
Driver.refresh() 刷新
Driver.back() 后退
Driver.forward() 前進
Driver.maximize_window() 最大化
Driver.set_window_size(100,200) 設置窗口大小
Driver.switch_to.window(searchwindow)
8) Frame
Driver.switch_to.frame(ReferenceFrame)
Driver.switch_to.parent_frame()  # frame需要一級一級切
Driver.switch_to.default_content()

21、關于自動化測試報告生成?

TestNG原生就可以生成測試報告,也有第三方叫reportNG的插件

22、怎么提高用例執行速度

TestNG配置并行執行
parallel="methods" thread-count="3"
parallel:指定并行執行方式(是否多線程并發運行測試;可選值(false | methods | tests | classes | instances),默認 "false")
thread-count:并行的值(并發執行時的線程池數量,默認為"5)

23、web自動化測試報告怎么輸出的
用TestNG生成報告,由于Testng生成的測試報告不夠直觀,可以使用reportng來生成
方法:
1)配置reportng依賴和監聽
2)在Window-->Preferences中設置
(1)禁用默認監聽器
(2)設置監聽器:org.uncommons.reportng.HTMLReporter
3)xml文件配置使用的reportng方法

  <listeners>
                      //testng的XML配置文件中添加這些內容
                     <listener class-name="org.uncommons.reportng.HTMLReporter" />
                     <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
            </listeners>

4)Html下的index.html 就是reportNg 生成的報告,另外TestNG-xslt也可以,但是沒有用過

  • TestNG xml參數文件詳解
testng.xml文件節點屬性說明:

suite屬性說明:
@name: suite的名稱,必須參數    
@junit:是否以Junit模式運行,可選值(true | false),默認"false"
@verbose:命令行信息打印等級,不會影響測試報告輸出內容;可選值(1|2|3|4|5) 
@parallel:是否多線程并發運行測試;可選值(false | methods | tests | classes | instances),默認 "false"
@thread-count:當為并發執行時的線程池數量,默認為"5"
@configfailurepolicy:一旦Before/After Class/Methods這些方法失敗后,是繼續執行測試還是跳過測試;可選值 (skip | continue),默認"skip"
@annotations:獲取注解的位置,如果為"javadoc", 則使用javadoc注解,否則使用jdk注解
@time-out:為具體執行單元設定一個超時時間,具體參照parallel的執行單元設置;單位為毫秒
@skipfailedinvocationcounts:是否跳過失敗的調用,可選值(true | false),默認"false"
@data-provider-thread-count:并發執行時data-provider的線程池數量,默認為"10"
@object-factory:一個實現IObjectFactory接口的類,用來實例測試對象
@allow-return-values:是否允許返回函數值,可選值(true | false),默認"false"
@preserve-order:順序執行開關,可選值(true | false) "true"
@group-by-instances:是否按實例分組,可選值(true | false) "false"

test屬性說明:
@name:test的名字,必選參數;測試報告中會有體現
@junit:是否以Junit模式運行,可選值(true | false),默認"false"
@verbose:命令行信息打印等級,不會影響測試報告輸出內容;可選值(1|2|3|4|5) 
@parallel:是否多線程并發運行測試;可選值(false | methods | tests | classes | instances),默認 "false"
@thread-count:當為并發執行時的線程池數量,默認為"5"
@annotations:獲取注解的位置,如果為"javadoc", 則使用javadoc注解,否則使用jdk5注解
@time-out:為具體執行單元設定一個超時時間,具體參照parallel的執行單元設置;單位為毫秒
@enabled:設置當前test是否生效,可選值(true | false),默認"true" 
@skipfailedinvocationcounts:是否跳過失敗的調用,可選值(true | false),默認"false"
@preserve-order:順序執行開關,可選值(true | false) "true"
@group-by-instances:是否按實例分組,可選值(true | false) "false"
@allow-return-values:是否允許返回函數值,可選值(true | false),默認"false"

性能測試類

1、 性能測試包含了哪些軟件測試(至少舉出3種)?

負載測試(Load Testing):負載測試是一種主要為了測試軟件系統是否達到需求文檔設計的目標,譬如軟件在一定時期內,最大支持多少并發用戶數,軟件請求出錯率等,測試的主要是軟件系統的性能。
壓力測試(Stress Testing):強度測試也就是壓力測試,壓力測試主要是為了測試硬件系統是否達到需求文檔設計的性能目標,譬如在一定時期內,系統的cpu利用率,內存使用率,磁盤I/O吞吐率,網絡吞吐量等,壓力測試和負載測試最大的差別在于測試目的不同。
容量測試(Volume Testing):確定系統最大承受量,譬如系統最大用戶數,最大存儲量,最多處理的數據流量等。
或者在下面選擇幾項:
并發測試 - 測試多用戶并發訪問同一個應用、模塊、數據時是否產生隱藏的并發問題
基準測試 - 比較新的或未知測試對象與已知參照標準(如現有軟件或評測標準)的性能。
爭用測試:- 核實測試對象對于多個主角對相同資源(數據記錄、內存等)的請求的處理是否可以接受。
性能配置 - 核實在操作條件保持不變的情況下,測試對象在使用不同配置時其性能行為的可接受性。
負載測試- 核實在保持配置不變的情況下,測試對象在不同操作條件(如不同用戶數、事務數等)下性能行為的可接受性。
強度測試- 核實測試對象性能行為在異常或極端條件(如資源減少或用戶數過多)之下的可接受性。
容量測試- 核實測試用戶同時使用軟件程序的最大數量

2、請問什么是性能測試、負載測試、壓力測試?

1)性能測試是通過自動化的測試工具模擬多種正常、峰值以及異常負載條件來對系統的各項性能指標進行測試。
2)負載測試、壓力測試參考答案如上題

3、什么時候可以開始執行性能測試?

在產品相對比較穩定,功能測試結束后。

3、簡述性能測試的步驟。
熟悉應用
了解應用的架構、功能邏輯
測試需求
1、需要將開發給定的需求轉為吞吐量和響應時間。
2、根據測試目的,細化需求
測試準備
測試準備包括測試客戶端機器準備、測試數據準備、測試腳本準備。
測試執行
測試的執行中,需要監控測試客戶端和服務器性能,監控服務器端應用情況:
客戶端的系統資源(cpu、io、memory)情況
服務端的系統資源(cpu、io、memory)情況
服務器的jvm運行情況
服務端的應用情況,看是否有異常
響應時間、吞吐量等指標
系統資源監控,linux下可以采用的工具有:vmstat、top、meminfo等。
JVM的監控,可以用jprofiler工具,linux下面的jmap、jhat等。
響應時間、吞吐量等,由grinder提供。
上述這些信息,一般在測試結束后,均需要歸檔整理,已備后續詳細分析
我們自己開發一套腳本,用于以固定的頻率獲取測試客戶端和服務器的vmstat和top輸出、grinder的log,并從中截取有用信息保存,用于事后分析。
每次測試運行完以后,肯定會增加很多數據,需要考慮本次執行對數據量的影響,如果數據量的變化對后續測試會有影響,則需要清理數據。
測試分析

4、lr和jmeter有什么區別

1).安裝:Jmeter安裝方便快捷,占據空間小,無需破解,無需費用;
LR安裝繁瑣,耗時長,對環境要求嚴格,占據空間大,安裝包為1G多,需 要破解,正版價格昂貴, LR11僅支持IE8~9,LR12無法破解,支持IE11及以上;
2).IP欺騙功能:IP欺騙是指在一臺PC機上可以模擬多個IP地址分配給并發用戶,能夠更加真實的模擬實際的應用環境;
Jmeter沒有IP欺騙功能,LR有IP欺騙功能
3).錄制腳本:Jmeter支持代理錄制腳本,但并不好用,需要裝IE代理,也可用badboy錄制; LR支持錄制腳本,方便使用;
4).壓力機資源情況:LR體積大,消耗的資源比Jmeter高,高并發情況下,LR可能出現壓力機資源瓶頸;
5).靜態資源下載:LR默認下載靜態資源,若不下載靜載資源需要手動配置;
Jmeter默認不下載靜態資源,若二者均使用默認設置,性能測試結果差異會較大;
6).協議:Jmeter只支持WEB、FTP和數據庫方面的性能測試;
LR支持協議多,能覆蓋絕大多數應用,功能強大;
7).網速模擬:Jmeter不支持網速模擬,LR支持網速模擬;
8).擴展性:Jmeter是開源的,可根據需要更改源代碼,LR可附加函數庫;
9).報告:Jmeter報表分析數據較少,LR報告監控的性能指標豐富,界面美觀;

5、Nginx和Tomcat是進程模式還是線程模式

Nginx:多進程. 一個主進程管理多個worker子進程
Tomcat:單進程多線程

Tomcat的運行模式有幾種?簡單講一下模式之間的區別

Tomcat的運行模式有3種, BIO、NIO和APR。我們公司用的NIO

BIO   
       一個線程處理一個請求。缺點:并發量高時,線程數較多,浪費資源。Tomcat7或以下,在Linux系統中默認使用這種方式。
NIO 
     利用Java的異步IO處理,可以通過少量的線程處理大量的請求。Tomcat8在Linux系統中默認使用這種方式。
     Tomcat7必須server.xml里的Connector節點配置來啟動:
     <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/> 
APR
     即Apache Portable Runtime,從操作系統層面解決io阻塞問題。Tomcat7或Tomcat8在Win7或以上的系統中啟動默認使用這種方式。

6、簡單說一下你們公司的系統架構(明日補充)

1)靜態文件、css樣式、文件模板放在了cdn上
2)Nginx負載均衡
3)

image
7、Nginx怎么獲取請求的真實ip

location 中配置 proxy_set_header X-Forwarded-For 然后服務端代碼 request.getHeader就可以獲得真實ip

server {
    listen       80;
    server_name  www.wenki.info;    #要訪問的域名

    charset utf8;

    location / {
        proxy_pass       http://server;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

8、全鏈路壓測做過嗎?怎么做的?

做過,全鏈路我們在正式環境做的
1)首先要梳理核心鏈路的流程,明確鏈路的邊界,核心鏈路是一個業務的核心,這一塊應該可以很快梳理清楚,但是,難點在于梳理清楚鏈路的邊界,分支業務
每個業務owner反復確認,哪些是核心業務,哪些是分支業務,哪些參與壓測,哪些不參與壓測,把這些形成文檔,逐個跟進。
2)提供全鏈路壓測的底層支持
我的理解:
流量、數據隔離 ,可以在head中打標
新建影子表,寫入和讀取都走影子表
日志-影子目錄:將壓測流量產生的日志落入到影子目錄

全鏈路透傳壓測標志:必須有一種在全鏈路透傳壓測標志的能力,并且必須基于一次請求,也就是同一個traceId,現在,大部分分布式業務都會接入trace系統,例如,google的dapper,阿里的鷹眼等,對trace系統進行改造,使其能夠透傳壓測標志,需要透傳的路徑大概有:

    HTTP,RPC(DUBBO),MQ,線程池等

影子表:參與壓測的業務,要逐個排查自己依賴的數據庫,然后創建影子表,影子表必須跟正常表的schema保持一致,可以在每次壓測時候手動創建,也可以推動DBA自動創建。創建好影子表后,如果當前流量是壓測流量,那么寫入和讀取都走影子表。如果有自己的數據庫中間件最好,沒有的話可以借助于Mybatis的Interceptor機制。
日志-影子目錄:為了防止壓測流程的日志對正常日志造成干擾,需要改造日志組件,將壓測流量產生的日志落入到影子目錄。影子目錄可以有日志組件自動創建。
MQ支持是否消費壓測流量:有的時候,全鏈路會通過MQ進行傳遞,所以,必須在消費MQ的時候進行選擇:是否選擇消費壓測流量的MQ消息。這就需要對MQ系統進行改造,一方面使其可以透傳壓測流量,另一方面,需要支持配置是否消費壓測的MQ消息
緩存,大數據隔離:還有一些場景,比如,緩存層,大數據層對壓測流量的處理也要考慮隔離。緩存可以使用不同的集群;大數據可以直接不收集壓測的數據

3)思考全鏈路壓測的數據怎么mock
在使用影子表之后,可以比較輕松的實現跟正常數據隔離,那剩下的就是好構造好mock數據,有幾點需要考慮:
① 用戶數據要提前做好認證等準備工作
② Mock數據要盡可能跟真實數據保持一致,比如,價格水平,圖片數量,地址信息等等
③ Mock數據有些限制需要放開,比如,庫存,一些運營性質的活動可以取消等
④ 千萬不要污染正常數據:認真梳理數據處理的每一個環節,確保mock數據的處理結果不會寫入到正常庫里面
4)梳理監控體系
① 核心接口和核心依賴的流量和耗時監控
② 中間件組件,緩存,數據庫的監控報警
③ 機器的指標報警
5)線下做好預演
真實的壓測之前,肯定要進行預演,預演主要確認:
① 壓測流程是否寫入到了正確的目的地,例如,寫入到影子表,影子目錄,壓測cache等等
② 壓測流量的降級是否完備和有效
③ 進一步確保監控都已到位

6)盡量模擬現實,用戶的行為,例如
① 購買的行為:不是下單后立即購買,而是要等一下子
② 騎車子的行為:開鎖后并不是里面換車,而是騎一會

7)逐步平滑加壓
壓測的時候,逐步加壓,并且要保持平滑加壓,不要把一秒的流量都在前面幾毫秒內都壓出去。

難點: 推進
全鏈路壓測的技術難點不多,除了要花時間梳理流程和思考如何處理數據之外,最難的就是整個鏈路跨多個業務,甚至部門,需要跟進每個業務線的進度,確保大家能夠在給定的時間點進行聯調以及進行壓測。在推進的時候,按照核心鏈路所在的模塊進行跟進,每個模塊出一個owner,各個owner跟進核心的接口和依賴,每周大家碰一下同步下總體的進度

什么情況下回出現Full GC,什么情況下會出現Young GC
  • 對象優先在新生代Eden區中分配,如果Eden區沒有足夠的空間時,就會觸發一次young gc
  • Full gc的觸發條件有多個,FULL GC的時候會STOP THE WORD。
    ① 在執行Young gc之前,JVM會進行空間分配擔保——如果老年代的連續空間小于新生代對象的總大小(或歷次晉升的平均大小),則觸發一次full gc。
    ② 顯式調用System.gc()方法時;
    ③ 方法去空間不足
    ④ 大對象直接進入老年代,從年輕代晉升上來的老對象,嘗試在老年代分配內存時,但是老年代內存空間不夠;
9、你們公司的jvm垃圾回收用的那種方法

答: copying ( 一般存活區使用這個算法)
問:為什么用copying?
答:第一個好處:沒有內存碎片的好處;第二:大小相等,位置互換,降低存活對象到老年區的評率,降低fullGC的頻率;
問:老年區你們用什么算法?
答:標記-整理,Mark-Compact
問:原理說一下,結合了標記-清楚和copying兩個的特點,優點有兩個,第一:可以使用全部的內存,第二:對內存做了壓縮、排序,減少了內存碎片

10、jvm內存分配比例是多少

整個堆大小=年輕代大小 + 年老代大小 + 持麗代大小。持麗代
一般固定大小為 64m,所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置年輕代大小為整個堆癿 3/8。現在一般都是年輕代3/1,老年代2/3,持久帶分別占用年輕代的1/10

11、如果現在讓你做10000并發,你怎么做的?

1)熟悉應用
了解了應用架構,我們才能知道,我們需要模擬的是:一般的html靜態文件請求、一般的servlet和jsp請求、AJAX請求、還是遠程調用請求等。
我們必須了解:應用的功能邏輯
2)明確測試需求
一般我們得到的任務類似:100萬uv(每天使用應用的人數)
但是,我們了解的是吞吐量、響應時間等指標,所以我們要根據自己的經驗轉換成一系列的指標。
100萬uv的活動時間分布,然后根據28原則算出tps,當然最后的結果還是要和整個team討論一下
3)測試準備
客戶端機器準備、測試數據準備、測試腳本準備、服務器端環境準備
客戶端機器:執行壓測腳本機器,首先客戶機資源要足夠,如果瓶頸在客戶機,無法評估服務端
測試數據:例如訂單商品掃描,那么首先我們需要造訂單數據和商品數據
測試腳本準備:腳本準備好,并先調試成功
服務端準備:最優:軟、硬件與線上一致,如果條件不允許,可以先壓單機,測出指標,然后增加一臺應用服務器做集群,測出指標,按照增加時的損耗,換算出線上環境支持的并發指標
4)測試執行
客戶端的系統資源(cpu、io、memory)情況
服務端的系統資源(cpu、io、memory)情況
服務器的jvm運行情況
服務端的應用情況,看是否有異常
響應時間、吞吐量等指標
5)測試分析
根據測試保存的數據和運行中的監控數據發現問題
常見的問題有:內存問題、有限資源競爭問題、軟件配置
內存可以使用:jmap,jhat,jstat,可以得到內存快照,得到堆內存的詳細信息,或者使用met
共享資源競爭問題:一個共享資源在一個時間點上,只能被一個線程獲得,其他線程必須等待,這就容易造成很多線程的timedwait狀態。通過jprofiler工具,能夠得到線程快照,并分析改進方法,也可以使用jstack打印棧信息進行分析
6)總結,輸出測試報告

12、設計性能測試方案需要考慮哪些問題?

時間成本、人力成本、環境&腳本可復用性、實現難度

13、壓測中TPS上不去,那么你怎么分析這個問題?
1、網絡帶寬
在壓力測試中,有時候要模擬大量的用戶請求,如果單位時間內傳遞的數據包過大,超過了帶寬的傳輸能力,那么就會造成網絡資源競爭,間接導致服務端接收到的請求數達不到服務端的處理能力上限。

2、連接池
可用的連接數太少,造成請求等待。連接池一般分為服務器連接池(比如Tomcat)和數據庫連接池(或者理解為最大允許連接數也行)。

3、垃圾回收機制
從常見的應用服務器來說,比如Tomcat,因為java的的堆棧內存是動態分配,具體的回收機制是基于算法,如果新生代的Eden和Survivor區頻繁的進行Minor GC,老年代的full GC也回收較頻繁,那么對TPS也是有一定影響的,因為垃圾回收其本身就會占用一定的資源。

4、數據庫配置
高并發情況下,如果請求數據需要寫入數據庫,且需要寫入多個表的時候,如果數據庫的最大連接數不夠,或者寫入數據的SQL沒有索引沒有綁定變量,抑或沒有主從分離、讀寫分離等,就會導致數據庫事務處理過慢,影響到TPS。

5、通信連接機制
串行、并行、長連接、管道連接等,不同的連接情況,也間接的會對TPS造成影響。

6、硬件資源
包括CPU(配置、使用率等)、內存(占用率等)、磁盤(I/O、頁交換等)。

7、壓力機
比如jmeter,單機負載能力有限,如果需要模擬的用戶請求數超過其負載極限,也會間接影響TPS(這個時候就需要進行分布式壓測來解決其單機負載的問題)。

8、壓測腳本
還是以jemter舉個例子,之前工作中同事遇到的,進行階梯式加壓測試,最大的模擬請求數超過了設置的線程數,導致線程不足。提到這個原因,想表達意思是:有時候測試腳本參數配置等原因,也會影響測試結果。

9、業務邏輯
業務解耦度較低,較為復雜,整個事務處理線被拉長導致的問題。

10、系統架構
比如是否有緩存服務,緩存服務器配置,緩存命中率、緩存穿透以及緩存過期等,都會影響到測試結果。

14、測試環境和生產環境服務器配比肯定不一樣?怎么保證性能測試的數據正確性?

-版本一致性
  包括操作系統、數據庫、中間件的版本,jdk、被測系統的版本。
-配置一致性
  系統(操作系統/數據庫/中間件/被測試系統)參數的配置一致,這些系統參數的配置有可能對系統造成巨大的影響。所以,除了保證測試環境與真實環境所使用的軟件版本一致,也要關注其參數的配置是否一致。

然后在單臺服務器上獲得具體的性能指標,每臺服務器能夠承受500用戶并發,平均TPS為60,響應時間為2秒,接著,添加負載均衡策略,再次測試負載策略下的數據損耗。得出數據后添加1臺負載均衡服務器,測試在兩臺服務器下每臺服務器的性能指標,以此類推

15、如何準備測試數據?如何防止數據污染?

生產數據備份、數據隔離、測試數據落入影子庫、擋板、mock都可以

16、線程和進程的區別?
   進程和線程都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同;

   (1)進程是資源的分配和調度的一個獨立單元,而線程是CPU調度的基本單元
      (2)同一個進程中可以包括多個線程,并且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進行至少包括一個線程。
      (3)進程的創建調用fork或者vfork,而線程的創建調用pthread_create,進程結束后它擁有的所有線程都將銷毀,而線程的結束不會影響同個進程中的其他線程的結束
      (4)線程是輕兩級的進程,它的創建和銷毀所需要的時間比進程小很多,所有操作系統中的執行功能都是創建線程去完成的
      (5)線程中執行時一般都要進行同步和互斥,因為他們共享同一進程的所有資源
      (6)線程有自己的私有屬性TCB,線程id,寄存器、硬件上下文,而進程也有自己的私有屬性進程控制塊PCB,這些私有屬性是不被共享的,用來標示一個進程或一個線程的標志

17、如果發現瓶頸,你怎么分析?

查找瓶頸時按以下順序,由易到難:服務器硬件瓶頸-〉網絡瓶頸(對局域網,可以不考慮)-〉服務器操作系統瓶頸(參數配置)-〉中間件瓶頸(參數配置,數據庫,web服務器等)-〉應用瓶頸(SQL語句、數據庫設計、業務邏輯、算法等)

19、簡單說幾個Nginx、Tomcat中的配置參數,參數是干什么的?

Nginx--配置文件名 nginx.conf
server_name:配置主機域名
Nginx:upstream,設置web服務器的ip、端口和權重
worker_connections:定義每個進程的最大連接數
keepalive_timeout :設置客戶端連接保存活動的超時時間
woker_precess :設置Nginx 啟動多少個工作進程的數量

Tomcat--配置文件名 server.xml
Connector port :配置端口
URIEncoding:解決中文亂碼
connectionTimeout: 連接超時時間(毫秒)
acceptCoumt="300" :指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
maxThreads="300" :允許最大的線程數
maxProcessors="1000" :同時最大的處理線程數,如果系統中已經有這個數字的線程,那么,更多的連接請求將進入排隊(ACCEPT COUNT)
minProcessors="5" :最小的處理線程數,即使沒有任何HTTP請求,TOMCAT也保持至少這么多線程以等待處理
JAVA_OPTS --Xms--Xxs :配置啟動時初始內存、最大內存,一般配置一樣
session-timeout:session超時時間

20、Redis支持哪些數據類型?

String字符串、Hash(哈希)、List(列表)、Set(集合) zset(sorted set:有序集合)

21、說幾個你工作中調優過的幾個實例
22、如果現在在壓測的時候cpu高,你怎么分析
23、你做性能測試一般遇到哪些類型的性能問題
  A. OOM內存不足:1\. 不斷地申請對象,后面對象申請不到內存資源(調整對象大小或擴容);2\. 持續地啟線程,申請棧資源,造成內存不足(調整每個線程的堆棧大小Xss=256或者擴容)3\. 頻繁地觸發FULL GC,造成OOM(調整新生代GC大小或降低GC的執行次數)

  B. 內存泄露:對象和線程等一直不釋放資源,導致內存泄露(釋放不必要的引用、使用對象緩存池、采用合理的緩存失效算法、合理使用SoftReference和WeekReference:SoftReference的對象會在內存不夠用的時候回收,WeekReference的對象會在Full GC的時候回收)

  C. 線程死鎖:兩個線程占用不同的資源不釋放,造成線程死鎖(規定資源執行順序,但是也會造成鎖饑餓,解決辦法是減短鎖釋放時間)

  D. 鎖爭用:很多線程競爭互斥資源,但資源有限, 造成其他線程都處于等待狀態(使用非阻塞隊列算法、拆分鎖,去除讀寫操作的互斥,盡可能少用鎖)

  E. 堆棧資源不足:線程嵌套式地申請堆棧資源,導致堆棧資源不足(調整堆棧大小)

  F. Java進程消耗CPU過高:1\. us高:執行線程不需要任何掛起動作,且一直執行,導致CPU 沒有機會去調度執行其他的線程。(增加Thread.sleep,以釋放CPU 的執行權,降低CPU 的消耗);2\. sy高:線程的運行狀態要經常切換(降低線程數) 

  G. 文件IO消耗嚴重:多個線程在寫進行大量的數據到同一文件,導致文件很快變得很大,從而寫入速度越來越慢,并造成各線程激烈爭搶文件鎖。(異步寫文件、批量讀寫、限流、限制文件大小)

  H. 網絡IO消耗嚴重: 同時需要發送或接收的包太多。(限流,限流通常是限制發送packet的頻率,從而在網絡IO消耗可接受的情況下來發送packget。)

24、線程的狀態有幾種?

在Java當中,線程通常都有五種狀態,創建、就緒、運行、阻塞和死亡。
1)第一是創建狀態。在生成線程對象,并沒有調用該對象的start方法,這是線程處于創建狀態;
2)第二是就緒狀態。當調用了線程對象的start方法之后,該線程就進入了就緒狀態,但是此時線程調度程序還沒有把該線程設置為當前線程,此時處于就緒狀態。在線程運行之后,從等待或者睡眠中回來之后,也會處于就緒狀態
3)第三是運行狀態。線程調度程序將處于就緒狀態的線程設置為當前線程,此時線程就進入了運行狀態,開始運行run函數當中的代碼。
4)第四是阻塞狀態。線程正在運行的時候,被暫停,通常是為了等待某個時間的發生(比如說某項資源就緒)之后再繼續運行。sleep,suspend等方法都可以導致線程阻塞。
5)第五是死亡狀態。如果一個線程的run方法執行結束,該線程就會死亡。對于已經死亡的線程,無法再使用start方法令其進入就緒狀態。

image

java基礎

1、equals與==的區別

使用==比較原生類型如:boolean、int、char等等,使用equals()比較對象。
1)==是判斷兩個變量或實例是不是指向同一個內存空間。 equals是判斷兩個變量或實例所指向的內存空間的值是不是相同。
2)==是指對內存地址進行比較。 equals()是對字符串的內容進行比較。
3)==指引用是否相同。 equals()指的是值是否相同

2、成員變量與局部變量的區別有那些?

① 成員變量是輸入類的,局部變量是在方法中定義的變量或是方法的參數
② 成員變量可以被public等修飾,局部變量不行
③ 成員變量是屬于對象的一部分,對象存在于堆內存中;局部變量存在于棧內存中
④ 成員變量值聲明不賦值的話,會自動以類型的默認值賦值;局部變量不會自動賦值;
⑤ 成員變量隨著對象的創建而存在;局部變量隨著方法的調用也消失

3、.講講對static的理解?J

靜態變量:
① 一個類只有一份被類的所有實例共享
② 能在沒有生成任何類的實例時就被訪問到
③ 直接使用類名來訪問
靜態方法:
① 可以在沒有任何實例時調用
② 不能在static方法內部訪問非static成員
③ 不能被重寫

4、 重寫和重載的區別?

重載規則:必須具有不同的參數列表; 可以有不同的返回類型;可以有不同的訪問修飾符;可以拋出不同的異常。
重寫規則:參數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是重載;返回類型必須一直與被重寫的方法相同,否則不能稱其為重寫而是重載;
訪問修飾符的限制一定要大于等于被重寫方法的訪問修飾符;
重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常,譬如父類方法聲明了一個檢查異常 IOException,在重寫這個方法時就不能拋出 Exception,只能拋出 IOException 的子類異常,可以拋出非檢查異常。

15、Reader和InputStream區別?

都是抽象類,Reader用于讀取字符流(char或String),InputStream用于讀取字節流(byte數組)

5、抽象類和interface的區別

① 抽象類可以有構造方法,接口中不能有構造方法
② 抽象類中可以有普通成員變量,接口中沒有普通成員變量
③ 抽象類中可以包含非抽象普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的方法。
④ 一個類可以實現多個接口,用逗號隔開,但只能繼承一個抽象類,接口不可以實現接口,但可以繼承接口,并且可以繼承多個接口,用逗號隔開。
⑤ 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問權限可以是任意的,但接口中定義的變量只能是 public static final 類型的,并且默認即為 public static final 類型

6、Java支持多繼承么?如果不支持,如何實現?

不支持,Java不支持多繼承。每個類都只能繼承一個類,實現多繼承有兩種方式,一是接口,而是內部類

7、構造器(constructor)是否可被重寫(override)?

構造方法是不能被子類重寫的,但是構造方法可以重載
簡單的講,就是說一個類可以有多個構造方法。

8、Array和ArrayList有什么區別?

可以將 ArrayList想象成一種“會自動擴增容量的Array”。
① Array類型的變量在聲明的同時必須進行實例化(至少得初始化數組的大小),而ArrayList可以只是先聲明
② Array對象的初始化必須只定指定大小,且創建后的數組大小是固定的,ArrayList的大小可以動態指定,其大小可以在初始化時指定,也可以不指定,也就是說該對象的空間可以任意增加

9、簡述Java中實現多態的機制是什么?

答:重載(overloading)、重寫(overriding)
1.重載(overloading):是一個類中多態的表現,比如一個類中定義多個同名的方法,但它們具有不同的參數或不同參數類型都稱之為重載。
2.重寫(overriding):子類定義一個方法和父類的方法名稱參數都相同,那么父類的方法被重寫。

10、.簡述java中super()和this()、super和this的區別?

答:①.super()和this()區別:
super():調用父類無形參的構造方法;
super(形參):調用父類中某個帶形參的構造方法;
this(形參):調用本類中另一種形式的構造方法
注意:放在方法的首行;
② .super和this的區別:
super.父類的成員變量;
super.父類的方法;
super:當子類中的成員變量、方法和父類的相同時,實現調用父類的成員變量和方法;
this:代表當前的對象;
使用的地方:若函數的形參和成員變量同名時,需要用this.成員變量名

11、Java中有哪些基本數據類型?String是基本數據類型嗎?String類是否能夠繼承?

答:
①.java定義了4中類8種基本類型:
整型:byte、short、int、long
浮點型:float、double
布爾型: boolean
字符型: char
②.String不是基本數據類型,String屬于引用類型。
③.String類是一個final類,因此不能被繼承。

12、.Integer和int的區別?

答:Integer是一個封裝int類型的封裝類,默認值為null,int是Java中8中數據類型之一,默認值為0.

13、String s=new String(“xyz”)創建了幾個對象?

答:創建2個String對象,一個是=null的s,一個是=“xyz”的string。

14、Java中堆和棧有什么不同?

每個線程都有自己的棧內存,用于存儲本地變量,方法參數和棧調用,一個線程中存儲的變量對其它線程是不可見的。而堆是所有線程共享的一片公用內存區域。

數據庫

1、數據庫的樂觀鎖和悲觀鎖是什么?

確保在多個事務同時存取數據庫中同一數據時不破壞事務的隔離性和統一性以及數據庫的統一性,樂觀鎖和悲觀鎖是并發控制主要采用的技術手段。

  • 悲觀鎖:假定會發生并發沖突,屏蔽一切可能違反數據完整性的操作
    在查詢完數據的時候就把事務鎖起來,直到提交事務
    實現方式:使用數據庫中的鎖機制
  • 樂觀鎖:假設不會發生并發沖突,只在提交操作時檢查是否違反數據完整性。
    在修改數據的時候把事務鎖起來,通過version的方式來進行鎖定
    實現方式:使用version版本或者時間戳
2、varchar和char的區別

Char是一種固定長度的類型,varchar是一種可變長度的類型

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372