第二次作業-熟悉使用工具
GIT地址 |
|
GIT用戶名 |
luomei1547 |
學號后五位 |
62201 |
博客地址 |
|
作業鏈接 |
https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2793 |
1. 准備工作
1.1 安裝 VS 2017
本次作業所需的vs 2017 已經在過去的c#課程中配置完成了,在以往的配置中未出現問題,最終環境如下圖所示:
1.2 注冊Github
在使用Microsoft Edge進入https://github.com/join並注冊GitHub賬號的時候,一直被提示無法核實驗證碼,如下圖所示:
登錄提示鏈接以后,提示需要使用支持的瀏覽器,並列舉了支持的瀏覽器類別,如下圖所示:
其中Microsoft Edge是支持的,但使用Microsoft Edge有時也會出現無法顯示身份驗證的模塊的問題,所以就去下載了Firefox ,
在Firefox中一步一步成功完成了注冊和登錄。
1.3 安裝git
進入https://git-scm.com/download/win后瀏覽器界面顯示開始下載,如下圖所示:
但實際上仿佛沒有任何的活動,然后點擊“click here to download manually”,於是跳出了下載界面。
點擊“保存文件”后,任務正式開始下載
這里需要說明一點,在Firefox中下載的速度是很慢的,但一般都可以成功下載,需要有點耐心,或者找其他下載源。
運行安裝包后,按照步驟就可以安裝成功了。
2. 代碼設計
2.1 題目背景
阿超家里的孩子上小學一年級了,這個暑假老師給家長們布置了一個作業:家長每天要給孩子出一些合理的,但要有些難度的四則運算題目,並且家長要對孩子的作業打分記錄。作為程序員的阿超心想,既然每天都需要出題,那何不做一個可以自動生成小學四則運算題目與解決題目的命令行 “軟件”呢。他把老師的話翻譯一下,就形成了這個軟件的需求:程序接收一個命令行參數 n,然后隨機產生 n 道加減乘除(分別使用符號+-*/來表示)練習題,每個數字在 0和 100 之間,運算符在 2 個 到 3 個之間。由於阿超的孩子才上一年級,並不知道分數。所以軟件所出的練習題在運算過程中不得出現非整數,比如不能出現 3÷5+2=2.6 這樣的算式。練習題生成好后,將生成的 n 道練習題及其對應的正確答案輸出到一個文件 subject.txt 中。當程序接收的參數為4時,以下為一個輸出文件示例。
13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
2.2 代碼設計具體思路
根據題目,可以把這次任務簡單的分成三個部分 :
① 生成規定操作符數量的四則運算表達式,這一步比較簡單,因為操作數永遠比操作符多一個,所以可以利用循環,隨機生成一個字符串,這里需要注意隨機數的種子選取問題,一般默認下選用的是機器時鍾時間,相比較計算機的運算速度來說,容易產生誤差,所以可以自定義種子值,以提高隨機數的隨機性。
1 //提高隨機數的隨機性,給定種子值iSeed 2 byte[] buffer = Guid.NewGuid().ToByteArray(); 3 int iSeed = BitConverter.ToInt32(buffer, 0); 4 Random rand = new Random(iSeed);
② 計算生成的四則運算表達式,並判斷其結果是否符合要求,其中運算過程不能出現小數幾乎可以等價於結果不能為小數,因為在操作符只有2、3個的四則運算中,只有除法會產生小數,從而導致結果產生小數,當操作符個數為2時,可以等價,但是當操作符個數為3時,在形如 1/2+1/2=1、1/3-1/3=0 ……中會出現過程中有小數,但是結果為整數的情況,這是因為,兩個小數相加減,可以出現整數結果,所以在這里,可以直接判斷生成的式子中若出現兩個“/”時,直接舍去這一結果,可以避免判斷每一部分是否為整數。計算一個四則運算表達式的字符串,可以使用DataTable.Compute,DataTable.Compute可以正確計算3/2以及2/3,
所以不需要考慮內部乘除結果,但實際操作下來,發現直接對DataTable.Compute測試是成功的,但在整個程序運行的結果來看,還是出現了保存了存在非整數的算式,所以在源代碼中還是判斷了除號的位置,導致運算量增加了不少,並且由於是舍棄一部分可能性,導致隨機生成的式子中出現除號的概率比較低。
③ 將符合要求的結果存入文件中,在存入第一個式子時,開始計數,不符合條件的不存入,不計數,直至計數值等於接收到的參數N即可結束程序。在這個問題中,我還增加了一個每次運行時都會先清空文件中上一次的內容,因為我覺得,單純的在同一個txt文本中不斷的增加隨機四則運算就會出現大量已經出過的題還保留在文件中,如涉及到避免重復出題,則可以不清空文件,把這個文件當做總數據進行查重,但題目中未提出該點要求,所以在這里選擇了清空文件已有的內容,僅存放每次運行后的結果。
1 //保存 2 static public string Save(string expression,string expression_double) 3 { 4 try 5 { 6 if (expression != null && expression_double!= null) 7 { 8 DataTable dt = new DataTable(); 9 double answer = Convert.ToDouble(dt.Compute(expression_double, "false")); 10 11 if (Convert.ToDouble(Convert.ToInt32(answer)) == answer && answer >= 0) 12 { 13 File.AppendAllText(@".\subject.txt", expression + "=" + (int)answer + "\r\n"); 14 return answer.ToString(); 15 } 16 return null; 17 } 18 else return null; 19 } 20 catch 21 { 22 return null; 23 } 24 }
至此,整個程序就可以完成了
3. 克隆項目以及提交代碼
3.1 使用github將項目克隆到自己的github倉庫中
進入https://github.com/Jupi4ter/AchaoCalculator后,點擊右上角的“Fork”,即可完成。
3.2 使用git將項目保存到本地
在進行上一步的“Fork”操作后,界面會自動轉到登錄用戶自己的倉庫中,點擊“Clone or download”,就可以看到一個克隆地址。
打開Git Bash,並輸入git clone <url>
運行結束后,在打開Git Bash的目錄下就會出現克隆到本地的項目。如直接在桌面創建Git Bash,則克隆的項目就存在桌面上。
3.3 代碼的提交
在完成源代碼的編寫以及測試后,可以查看一下倉庫狀態,並提交。
然后點擊自己倉庫界面的“New Pull Request”,然后點擊Create pull request 即可成功提交。
可在Jupi4ter的倉庫中查看自己提交的狀態。
4. 測試過程及效能工具的體驗
4.1 單元測試
在進行單元測試時,在函數名上右擊會有一個創建單元測試的選項,可以快速創建單元測試。在這里需要注意,Program需要設置成public才能成功創建。也可以右鍵單擊解決方案,添加一個新建項目,在類型里選擇:單元測試。
但是由函數自動生成的代碼中,會出現Assert.Fail(); 然后進行測試時,顯示,三個測試均未通過。
注釋掉三個Assert.Fail();測試就可以通過了
上網查了一下Assert.Fail();的作用:在不檢查任何條件的情況下使斷言失敗,
根據源代碼以及題目要求,設計了如下的測試用例

1 using Microsoft.VisualStudio.TestTools.UnitTesting; 2 using calculator; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace calculator.Tests 10 { 11 [TestClass()] 12 public class ProgramTests 13 { 14 [TestMethod()] 15 public void AddTest() 16 { 17 //判斷計數是否准確 18 Assert.AreEqual(Program.Add(5), 5); 19 } 20 21 [TestMethod()] 22 public void AutoTest() 23 { 24 //判斷是否能成功生成一個運算表達式的字符串 25 Assert.AreEqual(Program.Auto(2, 3, 0, 100), true); 26 } 27 28 [TestMethod()] 29 public void SaveTest() 30 { 31 //判斷結果為負數是否舍去 32 Assert.IsNull(Program.Save("3-2-3")); 33 //判斷結果為小數是否舍去 34 Assert.IsNull(Program.Save("3/5+2")); 35 //判斷出現除零錯誤是否舍去 36 Assert.IsNull(Program.Save("1/0-1")); 37 //判斷符合要求並保存的算式的結果是否正確 38 Assert.AreEqual(Program.Save("2+8/2"), (6).ToString()); 39 } 40 } 41 }
利用單元測試的確使我們的測試可以實行自動化,但是在編寫具體的測試代碼的時候,是要花很大的功夫去思考的,如何測試,要測試哪些數據,沒有返回值的函數如何找出有測試價值的地方。
接下來,是對斷點的熟悉,斷點可以很方便的幫助我們觀察函數中某一局部變量的變化情況,而且可以根據特定的輸入走特定的路徑,可以幫助我們檢測程序的路徑是否有效,還可以幫助我們判斷某一變量在特定語句結束后,是否能夠達到預期值等等很多問題。
4.2 回歸測試
回歸測試的重點就是防止程序“退化”,為了體驗回歸測試,修改了源程序代碼的一個小地方,將不出現負數的判斷條件刪除后, Assert.IsNull(Program.Save("3-2-3"));這個測試應該是通不過的,所以讓我們一起看一下結果吧
結果跟預想的一樣,因為測試用例是根據題目要求和運算規范設計過的,所以在修改源程序后,在上一次測試中可以通過的測試用例出現了錯誤,這就是發生了“退化”,回歸測試的重點在於避免程序越寫越錯,保證程序是在正確的基礎上“進化”的,這一點是很重要的,在沒有接觸到回歸測試的時候,每次寫代碼,改着改着,就發現前面用過的成功的輸入再次使用時發生了錯誤,只好再繼續改代碼,很容易越改越錯。
4.3 效能工具
根據作業提示,成功查看了代碼的效能分析
並創建了詳細的報告,如下圖所示,可以明確代碼哪部分的cpu占用高,就可以有針對性的進行代碼的優化。
5. 感想
英語是得學好,很多網站都是英文界面,雖然現在大多數可以自動翻譯成中文,但對官方的英文網站的內容翻譯偏差太大了,所以我認為專業英文的學習還是非常重要的。在接觸了單元測試和回歸測試后,對測試用例的重要性,以及測試自動化的重要性有了更直觀的感受。了解到git和github對版本的控制也是非常有利於日常工作的記錄和保存的。總之,在這一次作業中,了解到了相當多的新知識,有很多因為時間關系,只能淺顯的了解了一下,深入的了解還需要后續投入更過的時間, 我相信,好的工具的使用是會提高我們的工作效率的。
同時,因為此次作業有較為詳細的步驟指導,所以很少發生問題,只是對於git的工作模式不太了解,所以整個作業花了大部分時間去查資料,去搞清楚git的工作機制,第一次接觸這種工具,萬事開頭難,在看了很多人的介紹以后,對git有了大概的了解,對它所起的作用也有了自己的理解與認識。
最后是通過這一次課,感受到了很久沒敲代碼的壞處,很多常用的語句語法都需要翻書確認一下,雖然前段時間在敲微信小程序的代碼,但是已經很久沒敲過c#的代碼了,我覺得,每天都敲一點代碼,對自己的能力會有不錯的提升,起碼在以后的具體工作中可以減少查資料,翻書的時間,把更多的時間用在優化代碼上。