1. 程式人生 > >軟件質量與測試第4周小組作業:WordCount優化

軟件質量與測試第4周小組作業:WordCount優化

結果 eat run continue spec 過程改進 href 兼容 odin

軟件質量與測試第4周小組作業:WordCount優化

一、GitHub地址

https://github.com/fusidic/WC

二、PSP表格

PSP2.1 PSP階段 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 30 20
· Estimate · 估計這個任務需要多少時間 30 20
Development 開發 470 550
· Analysis · 需求分析 (包括學習新技術) 30 20
· Design Spec · 生成設計文檔 20 20
· Design Review · 設計復審 (和同事審核設計文檔) 30 20
· Coding Standard · 代碼規範 (為目前的開發制定合適的規範) 30 30
· Design · 具體設計 30 40
· Coding · 具體編碼 180 240
· Code Review · 代碼復審 30 30
· Test · 測試(自我測試,修改代碼,提交修改) 120 150
Reporting 報告 90 90
· Test Report · 測試報告 30 30
· Size Measurement · 計算工作量 30 30
· Postmortem & Process Improvement Plan · 事後總結, 並提出過程改進計劃 30 30
合計 590 660

三.模塊接口設計

處於任務分配的考量,我們小組將整個任務分成了輸入控制 內容讀取 分析核心 輸出控制 幾個功能模塊,同時在組長17002的建議下,我們采用了Kotlin來進行模塊的編寫,因為Kotlin簡潔,同時兼容Java,可以用Junit進行單元測試。

我負責的模塊,主要完成文件及參數讀取的功能,入口為ArgChecker類中的check函數

fun check(pindex: Int, pc: Int, msg: String): Boolean {
    if (pindex <= -1) return false
    if (pindex + 1 == pc) {
        throw IllegalArgumentException(msg)
    }

    return true
}

checkOutputArg()檢驗輸入參數的合法性

fun checkOutputArg(oindex: Int, args: Array<String>): Boolean {
    val ofname = args[oindex + 1]
    if (Options.values().map { it.value }.contains(ofname)) {
        throw IllegalArgumentException("invalid output file name")
    }
    return true
}

對於不同參數功能的調用則放在了主函數中

for (value in Options.values()) {
    val index = args.indexOf(value.value)
    if (index == -1) {
        continue
    }
    when (value) {
        Options.C -> {
        checker.check(index, pc, "-c error")
        cc = CharCounter().count(ifile)
        }
        Options.W -> {
            checker.check(index, pc, "-w error")
            wc = WordCounter().count(ifile)
        }
        Options.L -> {
            checker.check(index, pc, "-l error")
            lc = LineCounter().count(ifile)
        }
        else -> {

        }
    }
}

文件的字數統計則簡單的采用了Kotlin中的庫函數file.readText().length

四、設計測試用例與測試

對於CharCounter(),使用了Junit對其進行了單元測試,測試的文本是某網頁上的若幹段文字(位於類CounterTest中),通過文本軟件獲得了測試文本的字符數,然後編輯其測試程序

package test.com.dashmrl.wc.counter

import com.dashmrl.wc.counter.CharCounter
import org.junit.Test
import java.io.File
import kotlin.test.assertEquals

/**
 * Author    fusidic
 * Time      10:25
 * Date      2018/4/8
 * Email     [email protected]
 */
class CharCounterTest : CounterTest() {
    private val results = arrayOf(
            282,
            83,
            53,
            57,
            62,
            127,
            87,
            157,
            73,
            38,
            62,
            46,
            162,
            100,
            69,
            65,
            47,
            35,
            9,
            139
    )

    @Test
    fun count() {
        inputs.forEach {
            val c = CharCounter().count(createIntputFile(it, "input.txt"))
            assertEquals(results[inputs.indexOf(it)],c,"not equals,exit!!")
        }
    }
}

測試得到所有結果都與標準相符。

而對於參數輸入的測試,因為參數的判斷寫在主函數中,在其他功能模塊都完成了的情況下,ArgChecker的測試采用了黑盒測試的方法,通過bat腳本對其進行了黑盒測試。

wcPro.exe
wcPro.exe -c
wcPro.exe -w
wcPro.exe -l
wcPro.exe input.txt
wcPro.exe -c input.txt
wcPro.exe -w input.txt
wcPro.exe -l -o result.txt input.txt
wcPro.exe -c -w -l -o result.txt input.txt

以下列舉某次測試的結果,對非法輸入給出了警告:

PS C:\Users\Arith\Desktop> .\wcPro.exe -w
java.lang.IllegalArgumentException: no enough args!!
        at com.dashmrl.wc.WCKt.main(WC.kt:19)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:81)
        at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94)

五、小組貢獻分

0.27

六、參考鏈接

http://www.cnblogs.com/ningjing-zhiyuan/p/8654132.html

鄒欣 代碼規範與代碼復審

軟件質量與測試第4周小組作業:WordCount優化