顯示具有 敏捷開發 標籤的文章。 顯示所有文章
顯示具有 敏捷開發 標籤的文章。 顯示所有文章

2022年1月9日 星期日

新手學Docker 基本概念

有裝的vm的人都知道,當一台機器需要有兩個作業系統時,windows + Linux 怎麼辦? 最快的方法就是虛擬環境 VM,但需要切割一小塊的記憶體和空間,而且還需要安裝整個作業系統耶~ 於是有人提出了好方法 ,只要需要一小塊的空間 (Container) 容器,裝戴著部份核心的作業系統(比vm 更加的輕量化,就可以執行不同作業系統的功能,另外docker 不是用取代VM的,如果僅需要某些作業系統的核心或函式庫等就很適合Docker用法。

但是想瞭解docker ,網路上有太多的名詞【映像檔Image】、【容器Container】、【倉庫Responsiory】越聽越胡塗,簡單的說如比你有一個windows作業系統的碟片這我們稱之為image,你將光碟片的東西安裝起來後執行的作業系統稱為container,我的解讀是這個意思,但專業術語還是看以下的說明吧

原作者: https://cwhu.medium.com/docker-tutorial-101-c3808b899ac6

l  映像檔 Image

Docker 映像檔是一個模板,用來重複產生容器實體。例如:一個映像檔裡可以包含一個完整的 MySQL 服務、一個 Golang 的編譯環境、或是一個 Ubuntu 作業系統。

透過 Docker 映像檔,我們可以快速的產生可以執行應用程式的容器。而 Docker 映像檔可以透過撰寫由命令行構成的 Dockerfile 輕鬆建立,或甚至可以從公開的地方下載已經做好的映像檔來使用。

l  容器 Container

就像是用蛋糕模具烤出來的蛋糕本體,容器是用映像檔建立出來的執行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離、保證安全的平台。,Docker 映像檔是唯讀(read-only)的,而容器在啟動的時候會建立一層可以被修改的可寫層作為最上層,讓容器的功能可以再擴充。這點在下面的實例會有更多補充。

l  倉庫 Repository

倉庫(Repository)是集中存放映像檔的場所,也可以想像成存放蛋糕模具的大本營。倉庫註冊伺服器(Registry)上則存放著多個倉庫,你可以任易的取用使用透過docker 的指令,你可以在上面建立多個倉庫,然後透過 pushpull 的方式上傳、存取。

 l  啟用hyper-v

筆者用自身的經驗告訴大家如何安裝吧

如果你是 Windows 的專業版,就可以順利的點選以下的Hyper-Vtool

因為我的作業系統是window 10 家用版想啟用Hyper-V 的管理工具,沒有發現相關的選項~ 後續查相關文件發現是Windows home 不支援… WSDL, 我只能先用powershell 指令執行wsdl2

相關文件 : https://docs.microsoft.com/zh-tw/windows/wsl/install-manual

步驟一: 啟用windows 子系統linux

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

步驟二: 啟用VM

dism.exe/online/enable-feature/featurename:VirtualMachinePlatform/all/norestart

步驟三: 下戴Linux 核心更新套件

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

步驟四: wsl2 設為預設版本

wsl --set-default-version 2

以上做完後~ 恭喜你完成第一步了…  

l  安裝docker

相關文件: https://docs.docker.com/desktop/windows/install/

下戴點

https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe

 如果各位順利安裝完畢先恭喜各位完成docker安裝囉








2016年11月8日 星期二

specflow 如何自動產生文件規格

剛進公司就有91的訓練課程,剛好有機會接觸BDD的全貌流程,從完全不理解為何步驟如此頻繁透過工具簡化許多手動的操作的動作,進而提昇化工作效率的過程,以免日後忘了這個好用的東西,簡單作個分享囉~

一、外掛SpecFlow:
這是cucumber支援.net的擴充套件,真是佛心來的,可以從使用者的情境角度,直接相對應的產生測試案例,這比之前微軟推出的單元測試更直覺,還能重複使用情境案例


























安裝Nuget 套件
  1. NUnit
  2. SpecFlow
二、建立需求檔



新增Feature 的檔案後,要修改app.config 設定檔 --> 找到specFlow 的xml,修改如下所示
<specFlow>
     <unitTestProvider name="MsTest"></unitTestProvider>
</specFlow>



Feature.cs 預設以下的內文
Feature: example
In order to avoid silly mistakes (說明想做什麼)
As a math idiot (角色)
I want to be told the sum of two numbers (期望要驗證的事)

@mytag (允許將情境做分類)
Scenario: Add two numbers (情境說明要做什麼事)
Given I have entered 50 into the calculator (要加入的參教為 50 )
And I have entered 70 into the calculator (另外一個參教為 70 )
When I press add (執行add事件)
Then the result should be 120 on the screen (期望結果傳回120)

根據說明,修改我們的Feature 檔如下 :
舉例: 如果客戶的資料檔中如果共計有五筆資料,輸入查詢區間為2014-07-03~ 2014-07-07查詢結果為只有只有符合該區間的筆數共3筆,驗證其結果是否符合預期。


Scenario: 依據姓名、訂單日期起、訂單日期迄條件,查出顧客的訂單 (情境說明要做什麼事)
Given 查詢條件為 (要加入的參教為 資料表(CustomerId | OrderDateStart | OrderDateEnd)
| CustomerId | OrderDateStart | OrderDateEnd |
| Joey | 2014-07-03 | 2014-07-07 |
And 預計Customers資料應有 (要加入的參教為 資料表(CustomerID | CompanyName )
| CustomerID | CompanyName |
| Joey | SkillTree |
And 預計Orders資料應有 (要加入的參教為 資料表(CustomerID | OrderDate | ShipCity )
| CustomerID | OrderDate | ShipCity |
| Joey | 2014-07-02 | Taipei |
| Joey | 2014-07-03 | Taipei |
| Joey | 2014-07-04 | Changhua |
| Joey | 2014-07-05 | Changhua |
| Joey | 2014-07-08 | Changhua |
When 呼叫Query方法 (要執行 Query 的方法 )
Then 查詢結果應為 (預期傳回的結果 )
| CustomerID | OrderDate | ShipCity |
| Joey | 2014-07-03 | Taipei |
| Joey | 2014-07-04 | Changhua |
| Joey | 2014-07-05 | Changhua |

當我們的條件模擬狀況寫完了之後… 然到還要回到測試案例寫測試程式嗎當然不用啦Featur 的內文,按下【右鍵】產生Generate Stdep Definition 就產生對應的測試案例囉先給個讚吧!


按下右鍵 go to stdep Definition (到測試程式的函式名稱)
PS:測試內容當然要自已寫囉~~ 所以以下示範如何寫測試程式
[Binding]
[Scope(Feature = "OrderQuery")]
public class OrderQuerySteps
{
private OrderService target;
private NorthwindEntitiesInTest dbContext;
//在所有測試案例起動之前,執行此區塊,目的用來先清掉之前的遺留假資料
[BeforeScenario]
public void BeforeScenario()
{
this.target = new OrderService();
//為了直接測試資料庫的真實行為 呼叫entity 實體資料庫
using (dbContext = new NorthwindEntitiesInTest())
{
dbContext.Database.ExecuteSqlCommand("Delete [Orders] Where CustomerID IN ('Joey','JoeyTest')");
dbContext.Database.ExecuteSqlCommand("Delete [Customers] Where CustomerID IN('Joey','JoeyTest')");
}
}

//在所有測試案例起動之後,執行此區塊,目的用來先清掉之前的遺留假資料
[AfterScenario]
public void AfterScenario()
{
using (dbContext = new NorthwindEntitiesInTest())
{
dbContext.Database.ExecuteSqlCommand("Delete [Orders] Where CustomerID IN ('Joey','JoeyTest')");
dbContext.Database.ExecuteSqlCommand("Delete [Customers] Where CustomerID IN('Joey','JoeyTest')");
}
}

[Given(@"查詢條件為")]
public void Given查詢條件為(Table table)
{
//傳入的table 型態,直接轉換成物件
var condition = table.CreateInstance<OrderQueryCondition>();
//要將查詢條件暫存記憶體
ScenarioContext.Current.Set<OrderQueryCondition>(condition);

}

[Given(@"預計Customers資料應有")]
public void Given預計Customers資料應有(Table table)
{
var customers = table.CreateSet<SpecFlowWithEf.Tests.ModelInTest.Customers>();

using (dbContext = new NorthwindEntitiesInTest())
{
foreach (var customer in customers)
{
dbContext.Customers.Add(customer);
}
dbContext.SaveChanges(); //要將客戶的假資料存到實體資料庫中
}
}


[Given(@"預計Orders資料應有")]
public void Given預計Orders資料應有(Table table)
{
var orders = table.CreateSet<SpecFlowWithEf.Tests.ModelInTest.Orders>();

using (dbContext = new NorthwindEntitiesInTest())
{
foreach (var order in orders)
{
dbContext.Orders.Add(order);
}
dbContext.SaveChanges(); //要將訂單的假資料存到實體資料庫中
}
}

[When(@"呼叫Query方法")]
public void When呼叫Query方法()
{
//取得查詢條件的資料
var condition = ScenarioContext.Current.Get<OrderQueryCondition>();
//service回傳的,不一定需要是 dbContext EF 產生的 model 型別
IEnumerable<MyOrder> actual = this.target.Query(condition);
//將回傳的結果儲存
ScenarioContext.Current.Set<IEnumerable<MyOrder>>(actual);
}

[Then(@"查詢結果應為")]
public void Then查詢結果應為(Table table)
{
//將預期的結果儲存
var actual = ScenarioContext.Current.Get<IEnumerable<MyOrder>>();
//比較結果
table.CompareToSet<MyOrder>(actual);
}
}
PS:[BeforeScenario] [AfterScenario] 是自已加上的區塊,跑所以測試案例之前 或 之後都執行的區塊,如果不需要用到,也就不用特別加了。 以上截取91的上課程式範例

四、用工具產生文件
如果寫完所有的測試案例之後,主管要求寫文件,這也令工程師頭痛的吧~ 所以也有人佛心的寫的套件,自動產生線上文件喔,前提是要有Feature檔和自動產生的測試程式,才能自動產生文件喔… 讓我們再來看看神奇的魔術吧~

下戴工具包

或者 nuget pickles

nuget picklesui 圖形化的線上文件產生器


feature Directory : 選擇Feature 檔的資料夾
output Directory : 選擇 匯出文件的目錄
project name : 專案名稱
project version : 版次

產生的OrderQuery的需求案例


結論: 各位看倌~ 你不用寫任何一行文件需求,自動生成的文件,隨著案例不同,文件也隨之自動產生,不需要SA 或 工程師辛苦的修改文件了… 多麼神奇啊,每一次的修改程式都有不如預期的地方,也許是邏輯不夠完善,透過每次的演化BDD的情境模擬,來讓程式更加完善,需求異動頻繁更需要測試,透過VS擴充工具讓原本無法預期的程式變得更可預測,縮短BUG的週期… 如果有不完善的地方,還期望各位多多的補充喔…