關於C 中的API的定義

2021-06-21 22:54:25 字數 2919 閱讀 7442

最近在公司一直研究兩方面內容,一方面是api的定義,乙個就是c#中的mvc框架。今天來總結一下關於api的定義。

api 就是介面,它主要是向使用它的人提供一系列的解決方法。每一本api的定義步驟基本 大同小異。由於現在對於一些要求不是很嚴格的軟體採用的都是敏捷開發,所以我們可以很清楚的知道,一本api製作要經過三層結構,這三層分別是wcf層、service層、bl層。

首先我們來了解一下這三層結構分別得作用。第一層wcf層主要是定義介面,它定義的是前台傳來的url介面以及相關的響應介面方法,然後使用另外乙個類繼承並實現這個介面方法。接下來我們需要在實現類中進行相關的處理,這裡的處理主要有以下幾項,

1、寫日誌(為方便以後對api的負荷測試

之類的使用);

2、進行oauth認證,現在有很多的**都會有相關的內容,關於oauth認證

的詳細,以後再聊。

3、建立相關的key,用於在當前緩層中查詢相關的內容。(如果在緩層中能夠查詢到對應的key值,接下來就不用做任何操作,只需將緩層中的資料返還即可,這樣會在很大程度上減小資料庫的壓力,也能很快響應前台的請求。但是當前緩層中要是沒有相關的資料,那麼我們就得去資料庫中找資料了。)

4、緩層中沒有資料,我們就需要呼叫bl層的方法取資料。但是bl層只提供 了介面方法,不過在其實現層中提供了相關的實現,這樣就方便了我們的使用,bl主要的作用就是與資料庫打交道。bl層在資料庫中找資料,找到的資料就需要我們存放到乙個dto(資料傳輸物件)中。但是這還不是重點,bl層的重點是取資料。由於微軟對於資料庫取資料的方法提供了很多種可能,我們可以使用微軟的linq、也可以使用傳統的sql文,還可以使用儲存過程(stored procedure)。這三個各有千秋。這裡不作詳談。

5、bl層從資料庫中取完資料後,需要將資料存放到乙個dto實體中,然後返回到service層,service層接受完資料後,不算完事大吉,這時候還需要根據要求將其轉換成一定的結構,常用的結構是json格式。

6、最後將這個json格式串返回請求。

這樣一套流程走下來基本上就算是完成了一本api的新規。但是對於api的新規不算完事,重頭戲還在後頭,那就是我們常見的測試。

一般來講公司裡對於api的測試會有所不同,一般會有兩種,一種是ut測試,一種是bt測試。所謂ut測試就是單元測試,他需要將自己在api中定義的每乙個方法都要測試一遍,保證它的準確性,換句話說他是測試準確率。bt測試就是行為測試,他要求我們將自己寫的api中的每一種可能的情況包括取資料的每一種可能都要跑到,換句話說它是測試覆蓋率。

一般來講,一本新規的api需要自己在資料庫中造資料才能測試,但是在ut測試的時候還不需要,在ut測試的時候,測試service層時我們使用mock來模擬取出的資料,這樣還算比較容易,難點是在對於bl層的ut測試,它本身是和資料庫連線來取資料的,所以,這時候我們需要自己往資料庫種茶資料,以滿足我們寫的每一條case。當然微軟已經為我們提供了相關的方法,所以我們不需要擔心每一次都需要自己手動在資料庫中加資料,也不必擔心自己插的資料會不會在整體上影響到實際的資料。

說完這兩點,或許你還沒有什麼太大的概念,但是我需要告訴你的是,在ut測試的時候難點不是造資料,難點是如何設計你的case,一般來講我們可以先寫異常系,考慮他可能會出錯的幾種情況,一般來講,出錯的幾種情況無非就是幾種異常。難就難在正常系,當我們的引數越多,我們的正常系case也就隨之變得很多。對於正常系的case,首先我們考慮所有引數全部正確的情況,取到資料,和取不到資料,接下來,我麼就需要考慮各種引數不正確的情況。

這樣我們的ut設計也就基本完成,寫完case還得讓他跑成功啊。所以我們常常借用nunit或者是resharper自帶的。詳細不作介紹。

完成了ut我們還需要設計bt。

接下來我們看一下bt測試。首先類看一下基本的格式

feature: api名稱

相關的資訊。

@mytag

scenario outline: 要測試的問題

given  傳入的引數的設定

when 使用什麼方法處理

then 進行結果的比對

examples:

| 引數1      | 引數2              | 結果                |

| 1000       | 1500000900 | 400                 |

這樣乙個基本的bt測試用例就出來了,關於其中的一些標籤不作詳細介紹。

bt就這樣簡單?  no。bt測試怎麼會就這麼簡單呢,這還只不過是他的介面格式,實際內容還有很多。首先關於引數怎麼設定,這就需要我們寫乙個類platformargamastepdefinitions來進行具體的定義。基本格式如下

#region 設定內容

[given(@"設定的內容引數")]

public void given引數設定(string 引數)

#endregion

這樣乙個引數設定的內容就基本設定完畢。那麼使用什麼方法處理怎麼解決呢?同樣還是在著各類中定義,它的格式如下

[when(@"處理方式")]   //注意這裡的名稱要與上文中when後的一摸一樣

public void when處理方法()

關於then的格式其實差不多,如下:

[then(@"傳參和相關資訊描述")]

public void then相關資訊的描述(int p0)

了解了bt測試的基本格式之後我們需要了解詳細的btcase的設計。btcase測試的重點是要講我們在api中的每一種可能都包含,但不需要重複。剛才我們已經經過的ut測試,確保了函式的正確性之後,我們需要測試整體結果是否理想。所以這一步的重點應該有以下幾個方面。

第一:我們取資料時候有可能會出現的情況

好了,對於第一條我們重點是考慮我們的儲存過程或者sql文或者是linq語句。首先考慮我們取資料的屬性有哪些?也就是我們select之後的內容。其次我們要測試sql語句設計的資料表,應該考慮到這些表可能存在沒資料的 情況。最後對於判定的情況應該設計兩條資料讓他能將幾種可能都跑到。

這樣一套流程結束後在進行以下負荷測試就算基本結束。

幾個常用的API在c 中的定義

最近乙個專案中用到的一些api,在解決一些實際的問題上 特別是和外部程式打交道 的時候還是蠻有用的。具體的引數什麼的網上都有!public class api public intheight 獲得包含指定點的視窗的控制代碼 乙個被檢測的點的point結構 dllimport user32.dll ...

Node 中 關於Fs的api

require 的匯入規則 require 想要匯入自定義的模組 必須加路徑 dirname 模組中這個內建變數是當前模組所在的絕對路徑 fillename 相對於 dirname來講 多了模組名稱 fs內建模組 實現i o操作 以下結果自行測試 雖然我已經試了 let fs require fs ...

關於C 類的定義

1 類體中不允許對定義的資料成員進行初始化。2 類中的資料成員不能是自身類的物件但是可以是自身類的指標或者引用。3 建構函式可以過載,不能直接呼叫,在建立物件時自動呼叫。4 乙個類只有乙個析構函式,可以被呼叫也可以自動呼叫。自動呼叫的情形是 物件的宣告期結束,比如區域性物件。2 乙個物件用new運算...