程序員面試修煉09 | 網(wǎng)易2016內(nèi)推筆試題

當(dāng)你想在你的代碼中找到一個錯誤時,這很難;當(dāng)你認為你的代碼是不會有錯誤時,這就更難了。

——Steve McConnell 《代碼大全》


名詞解釋

1、UT:(Unit Testing,單元測試),單元測試的對象是LLD中所劃分定義的程序單元或模塊,它也是單元測試用例設(shè)計中可測試的最大單元。該測試對象可能由一個或多個函數(shù)或者類組成,測試設(shè)計就是對測試對象進行測試用例設(shè)計。

2、IT:(Integration Testing,集成測試),集成測試是指把若干個經(jīng)過單元測試的單元組裝到一起而進行的測試,集成測試應(yīng)依據(jù)HLD,主要發(fā)現(xiàn)接口、依賴中的錯誤或不完善的地方。集成測試的對象為若干個單元測試對象的組合,至少為兩個。

3、ST:(System Testing,系統(tǒng)測試),系統(tǒng)測試是針對軟件項目組所承擔(dān)開發(fā)的軟件系統(tǒng)進行的整體測試,將軟件系統(tǒng)作為整體運行或?qū)嵤┟鞔_定義的軟件行為子集的測試。主要采用的測試方法是黑盒測試,即不管程序內(nèi)部的實現(xiàn)邏輯,以檢驗輸入輸出信息是否符合規(guī)格說明書中有關(guān)需求規(guī)定的測試方法??梢奡T的測試對象是規(guī)格說明書,更確切的說,是模塊需求規(guī)格說明書,所以一般也稱為MST。模塊SRS文檔給出了模塊的輸入輸出的相應(yīng)要求。MST后,每個模塊是牢固可用的。

image

筆試/面試真題真題

題目描述(網(wǎng)易-2016內(nèi)推筆試題)

有 n 個學(xué)生站成一排,每個學(xué)生有一個能力值,牛牛想從這 n 個學(xué)生中按照順序選取 k 名學(xué)生,要求相鄰兩個學(xué)生的位置編號的差不超過 d,使得這 k 個學(xué)生的能力值的乘積最大,你能返回最大的乘積嗎?

輸入描述:

每個輸入包含 1 個測試用例。每個測試數(shù)據(jù)的第一行包含一個整數(shù) n (1 <= n <= 50),表示學(xué)生的個數(shù),接下來的一行,包含 n 個整數(shù),按順序表示每個學(xué)生的能力值 ai(-50 <= ai <= 50)。接下來的一行包含兩個整數(shù),k 和 d (1 <= k <= 10, 1 <= d <= 50)。

輸出描述:

輸出一行表示最大的乘積。

輸入例子:

3
7 4 7
2 50

輸出例子:

49

解題思路:

dp。由于本題求的是乘積最大,而且數(shù)據(jù)存在負數(shù),那么就需要存儲最大值以及最小值。dp[i][j] 表示選第 i 個學(xué)生作為第 j 個備選人,mins存最小值,maxs存最大值。

代碼示例:

#include <cstdio>  
#include <cstring>  
#include <iostream>  
#include <algorithm>  
using namespace std;  
const int maxn = 50 + 5;  
const long long minn = -1e17;  
struct DP {  
    long long mins;  
    long long maxs;  
}dp[maxn][15];  
int n;  
int a[maxn];  
int k, d;  
void input() {  
    for(int i = 1; i <= n; ++i) {  
        scanf("%d", &a[i]);  
    }  
    scanf("%d%d", &k, &d);  
}  
void solve() {  
    memset(dp, 0, sizeof(dp));  
    for(int i = 1; i <= n; ++i) dp[i][1].mins = dp[i][1].maxs = a[i];  
    long long ans = minn;  
    for(int i = 1; i <= n; ++i) {  
        for(int ki = 2; ki <= k; ++ki) {  
            int j = i - d;  
            if(j <= 0) j = 1;  
            for(; j < i; ++j) {  
                dp[i][ki].mins = min(dp[i][ki].mins, min(dp[j][ki - 1].mins * a[i], dp[j][ki - 1].maxs * a[i]));  
                dp[i][ki].maxs = max(dp[i][ki].maxs, max(dp[j][ki - 1].mins * a[i], dp[j][ki - 1].maxs * a[i]));  
            }  
        }  
    }  
    for(int i = 1; i <= n; ++i) {  
        ans = max(ans, dp[i][k].maxs);  
    }  
    printf("%lld\n", ans);  
}  
int main() {  
    while(scanf("%d", &n) != EOF) {  
        input();  
        solve();  
    }  
    return 0;  
}  
image

技術(shù)知識點

軟件測試方法**

軟件研發(fā)過程中產(chǎn)生的所有文檔和代碼都可以稱之為軟件產(chǎn)品,同時,只要是軟件產(chǎn)品,都是測試的對象,即軟件測試對象為軟件生命周期中產(chǎn)生的所有文檔和代碼。

1. 根據(jù)利用的被測對象信息的不同,將軟件測試方法分為黑盒測試、灰盒測試和白盒測試。

白盒測試

1)定義:是依據(jù)被測軟件分析程序內(nèi)部構(gòu)造,并根據(jù)內(nèi)部構(gòu)造分析用例,來對內(nèi)部控制流程進行測試,可完全不顧程序的整體功能實現(xiàn)情況,即已知軟件產(chǎn)品的內(nèi)部實現(xiàn)過程,可以通過測試證明每種內(nèi)部操作是否符合設(shè)計規(guī)格的要求,所有內(nèi)部成分是否已經(jīng)過檢查。

2)思想:白盒測試又被稱為玻璃盒測試、透明盒測試、開放盒測試、結(jié)構(gòu)化測試、邏輯驅(qū)動測試、是基于程序結(jié)構(gòu)的邏輯驅(qū)動測試。

3)測試對象: 函數(shù)、算法與數(shù)據(jù)結(jié)構(gòu)

4)目的

a. 一般在測試前期進行,通過達到一定的邏輯覆蓋率指標(biāo),使得軟件內(nèi)部邏輯控制結(jié)構(gòu)上的問題能基本得到消除;

b. 保證內(nèi)部結(jié)構(gòu)達到一定的覆蓋程度,能夠給予軟件代碼質(zhì)量更大的保證;

c. 白盒測試發(fā)現(xiàn)問題后,解決問題的成本較低。

5)白盒測試的常用技術(shù)

a. 靜態(tài)分析:包括控制流分析、數(shù)據(jù)流分析、信息流分析

b. 動態(tài)分析:邏輯覆蓋測試(分支測試、路徑測試等)、程序插裝等

邏輯覆蓋測試根據(jù)覆蓋的對象不同,可以分為:語句覆蓋、判定(分支)覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋、路徑覆蓋。

程序插裝指調(diào)試程序時,在程序中插入一些打印語句,程序執(zhí)行時打印出我們關(guān)心的信息,通過這些信息了解執(zhí)行過程中程序的一些動態(tài)行為。

邏輯覆蓋率的統(tǒng)計通過程序插裝來實現(xiàn)。

6)白盒測試的特點:

  a. 測試人員需要了解軟件的實現(xiàn);

  b. 可以檢測代碼中的每條分支和路徑;

  c. 揭示隱藏在代碼中的錯誤;

  d. 對代碼的測試比較徹底;

  e. 實現(xiàn)代碼結(jié)構(gòu)上的優(yōu)化;

  f. 投入較大,成本高;

  g. 無法檢測代碼中遺漏的路徑和數(shù)據(jù)敏感性錯誤;

  h. 不驗證規(guī)格的正確性。

黑盒測試

1)定義:把測試對象看成是一個黑盒,只考慮其整體特性,不考慮其內(nèi)部具體實現(xiàn)過程。即已知產(chǎn)品的需求規(guī)格,但不知其內(nèi)部實現(xiàn),可以進行測試證明每個需求是否實現(xiàn)。

2)思想:基于規(guī)格的測試,測試類型都來源于質(zhì)量模型。

3)測試對象:系統(tǒng)、子系統(tǒng)、模塊、子模塊、函數(shù)等。

4)常用的黑盒測試方法:等價類劃分法、邊界值分析法、因果圖分析法、判定表法、狀態(tài)遷移法等。

5)目的:減少測試時的測試用例數(shù),用盡量少的測試用例完成測試,發(fā)現(xiàn)更多的問題。

6)黑盒測試的特點

  a. 對于更大的代碼單元來說(子系統(tǒng)甚至系統(tǒng)級)比白盒測試效率要高;

  b. 測試人員不需要了解軟件的實現(xiàn)細節(jié),包括特定的編程語言;

  c. 從用戶的視角進行測試,很容易被理解和接受;

  d. 有助于暴露任何規(guī)格不一致或有歧義的問題;

  e. 沒有清洗和簡明的規(guī)格,測試用例很難設(shè)計;

  f. 不能控制內(nèi)部執(zhí)行路徑,會有很多內(nèi)部程序路徑?jīng)]有被測試到;

  g. 不能直接針對特定的程序段,這些程序可能非常復(fù)雜(因此可能隱藏更多的問題)

灰盒測試

利用被測對象的整體特性信息,采用黑盒測試方法;利用被測對象的內(nèi)部具體實現(xiàn)信息,采用白盒測試方法;介于白盒和黑盒測試之間的測試方法測試方法稱之為灰盒測試。

1)定義:如果即利用被測對象的整體特性信息,又利用被測對象的內(nèi)部具體實現(xiàn)信息,采用得就是灰盒測試方法。兩種信息占得比例不同,相應(yīng)的灰度就不同。

2)適用對象:一般集成測試采用灰盒測試方法。

2. 按照被測試的軟件系統(tǒng)是否運行,將測試分為靜態(tài)測試和動態(tài)測試。

靜態(tài)測試

1)定義:不運行被測試的軟件系統(tǒng),而是采用其他手段和技術(shù)對被測試軟件進行檢測的一種測試技術(shù),例如:代碼走讀、文檔評審、程序分析等。

2)常用技術(shù):靜態(tài)分析技術(shù)。

  a. 定義:靜態(tài)分析是一種不通過執(zhí)行程序而分析程序的技術(shù)。

  b. 功能:檢查軟件的表示和描述是否一致,沒有沖突或者沒有歧義

  c. 目的:糾正軟件系統(tǒng)在描述、表示和規(guī)格上的錯誤,因此是任何進一步測試的前提。

  d. 靜態(tài)分析技術(shù)主要有3種不同的程序測試可能性

     *1*:考慮程序是否滿足編碼規(guī)則,語法上是否具有一致性和完整性;

     *2*:考慮文檔描述是否規(guī)范、準確、便于查閱;

     *3*:考慮程序和文檔之間的一致性。

  e. 靜態(tài)分析技術(shù)有:控制流分析、數(shù)據(jù)流分析和信息流分析,下面簡單介紹:

     *1*:控制流分析

       #1# 控制流相關(guān)概念

       ① 程序元素:一個程序元素通常是一個條件,一個簡單的語句或者一塊語句(多個連續(xù)語句)。

       ② 控制流關(guān)系:一個程序的控制流關(guān)系(Control FlowRelation)敘述了程序元素和他們執(zhí)行的次序之間的關(guān)系。

       ③ 控制流圖:對應(yīng)于控制流關(guān)系的圖被稱為控制流圖。

       ④ 控制流矩陣:有控制流圖得到,反映相鄰程序元素之間的先后順序關(guān)系。

      #2# 控制流分析能發(fā)現(xiàn)的問題

      通過對控制流信息進行分析,確保寫出的程序不應(yīng)包含:轉(zhuǎn)向并不存在的標(biāo)號;沒用的語句標(biāo)號;從程序入口進入后無法達到的語句;不能達到停機語句的語句。

     *2*:數(shù)據(jù)流分析

      #1# 數(shù)據(jù)流相關(guān)概念

      數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目標(biāo)碼而出現(xiàn)的,這類方法主要用于代碼優(yōu)化(代碼優(yōu)化主要包含:結(jié)構(gòu)優(yōu)化即可讀性、時間效率和空間效率優(yōu)化、可移植性優(yōu)化)。

      數(shù)據(jù)流分析法關(guān)鍵是數(shù)據(jù)的引用和定義。

       ① 數(shù)據(jù)的定義:如果程序中某一語句執(zhí)行時能改變某程序變量V的值,則稱V是被該語句定義的。

       ② 數(shù)據(jù)的引用:如果程序中一語句的執(zhí)行引用了內(nèi)存中變量V的值,則稱V是被該語句引用的。

       #2# 數(shù)據(jù)流分析步驟

       ① 根據(jù)代碼得到數(shù)據(jù)流表

       ② 分析數(shù)據(jù)流表找到以下兩種錯誤:

            變量未定義但被引用

            變量定義但未被引用

動態(tài)測試

1)定義:按照預(yù)先設(shè)計的數(shù)據(jù)和步驟去運行被測軟件系統(tǒng),從而對被測試軟件進行檢測的一種測試技術(shù)。

2)特點:主要分析軟件系統(tǒng)在模擬或是真實的環(huán)境中執(zhí)行之前、之中、之后的動態(tài)行為。

3)常用技術(shù):動態(tài)分析技術(shù)

  a. 定義:對軟件系統(tǒng)運行行為進行分析,包含程序在受控的環(huán)境下使用特定的輸入進行正式的運行,和期望的結(jié)果比較以檢查系統(tǒng)運行是正確還是不正確。

  b. 常用動態(tài)分析技術(shù):

    *1*:路徑測試

    *2*:分支測試

    *3*:性能測試

  c. 常用動態(tài)分析工具及功能

    *1*:測試覆蓋率分析:用于測試對代碼的檢測范圍;

    *2*:跟蹤:跟蹤程序執(zhí)行期間的所有路徑

    *3*:調(diào)整:度量程序執(zhí)行過程中所有的資源

    *4*:模擬:模擬系統(tǒng)的部分

3. 所有測試方法都可以歸類為手工測試和自動化測試。

手工測試

1)定義:手工測試是傳統(tǒng)的測試方法,由測試人員手工編寫測試用例,執(zhí)行,觀察結(jié)果。

2)缺點:測試工作量大,重復(fù)多,回歸測試難以實現(xiàn)

自動化測試

1)定義:自動化測試指利用軟件測試工具自動實現(xiàn)全部或者部分測試工作:管理、設(shè)計、執(zhí)行和報告,自動化測試節(jié)省大量的測試開銷,并能夠完成一些手工測試無法實現(xiàn)的測試。

2)自動化測試的意義

  a. 對程序新版本運行前一版本執(zhí)行的測試,提高回歸測試效率

  b. 可以運行更多更頻繁的測試

  c. 可以執(zhí)行手工測試困難或不可能做到的測試,比如大量的重復(fù)操作或者集成測試

  d. 更好的利用資源,比如測試儀器或者被測對象

  e. 測試具有一致性和可重復(fù)性,及自動化測試的步驟和結(jié)果完全一樣的測試的復(fù)用性,及自動化測試甲苯可以拆分開給其他測試腳本使用

  f. 可以更快地將軟件推向市場,軟件發(fā)布前進行高效的回歸測試,減少軟件發(fā)布的時間

  g. 增加軟件的信任度,通過自動化測試提高了測試效率,可以吧節(jié)約的時間拿出來做更多的測試

3)自動化測試的限制

  a. 不能取代手工測試,自動化測試只能提高測試效率,不能提高測試有效性,即不可能發(fā)現(xiàn)更多缺陷更多

  b. 對測試設(shè)計依賴性極大,測試設(shè)計的不好會遺漏問題

  c. 自動化測試對軟件開發(fā)具有很大的依賴性,開發(fā)出現(xiàn)變更可能導(dǎo)致前面的自動化測試完全失效

  d. 工具本身并不具備想象力,工具不具有智能

4)自動化測試的誤區(qū)

  a. 不現(xiàn)實的期望,希望自動化能取代手工測試

  b. 缺乏測試實踐經(jīng)驗,手工測試都做不好,或者經(jīng)驗積累不夠,就嘗試自動化,很難成功

  c. 期望自動化測試發(fā)現(xiàn)大量新缺陷,自動化只能保證測試執(zhí)行效率,確保已有的問題不會再發(fā)生,發(fā)現(xiàn)新缺陷不是其目的

  d. 安全性錯覺,認為進行了自動化測試的軟件就是安全的、質(zhì)量有保證的只有手工測試做好了,明確了測試的觀察點,才能把自動化測試做好,所以手工測試是自動化測試的一個基礎(chǔ)

大廠暑期實習(xí)的招聘已到中后期,大部分的同學(xué)手中還沒有offer,一部分的同學(xué)在備胎池中煎熬著。但是,那一小部分已經(jīng)拿到offer的同學(xué),不一定就在輕輕松松的玩耍,人家說不定比你更努力。幸運總是會眷顧有準備的人,小伙伴們,跟著【19應(yīng)屆生】學(xué)習(xí)產(chǎn)品知識,我們一起加油吧~!

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,262評論 8 265
  • 1****、問:你在測試中發(fā)現(xiàn)了一個bug****,但是開發(fā)經(jīng)理認為這不是一個bug****,你應(yīng)該怎樣解決? 首...
    蛋炒飯_By閱讀 5,399評論 1 94
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 一毛,馬上就是你十九歲生日了,我們在遙遠的故鄉(xiāng)遙祝你生日快樂!在你到部隊的這段時間里,看到你不斷地成長,懂事,成熟...
    清淡天和_ec01閱讀 193評論 0 0
  • 感賞我看到一顆顆樹上的葉子都變綠了,感覺特別好看,嫩嫩的,綠綠的。在往遠一點的地方看過去,一大片成了一幅綠色生機勃...
    心靈驛站園閱讀 153評論 0 1

友情鏈接更多精彩內(nèi)容