您的位置:新葡亰496net > 奥门新萄京娱乐场 > 第二周作业,一步一步教你编写与搭建自动化测

第二周作业,一步一步教你编写与搭建自动化测

发布时间:2019-12-10 13:47编辑:奥门新萄京娱乐场浏览(53)

      此次项目在github上的地址:

    软件质量与测量试验--第二周作业 WordCount,第二周wordcount

    1. Python安装
        官方网址提供三种主意,平常Windows下直接安装exe即可;Linux下基本上自带python;别的也提供源码,也可自动编译;
        若安装后无法使用,则检查一下情形变量是或不是设置科学。
        额外:除了最入眼的官方网址资料、文书档案外,Python的wiki也提供了无数实用的音信

    2. Python相关源码
        0) 标准库
        1卡塔尔 PyPi包索引(可透过pip工具安装卡塔尔(英语:State of Qatar)
        2) GitHub上的Python项目
        3卡塔尔 Code activestate上边的Python代码片段

    3. Python安装包
        0卡塔尔国 msi或exe格式直接运行安装
        1卡塔尔(قطر‎ pip方式安装,pip install 可设置whl格式或新本子pip下可径直设置包PyPi下内定的包
        2) easy_install 安装egg格式的包
        3卡塔尔(英语:State of Qatar) 对于提供源码的包,可透过python setup.py install 安装,日常会提供setup.py文件

    4. Python开拓条件
        0卡塔尔国 vim /notepad /Sublime Text等风姿洒脱多种编辑器
        1卡塔尔(英语:State of Qatar) 自带的依据Tk的IDLE/IPython
        2卡塔尔 PyCharm/Eric恐怕Eclipse PyDev/VS等依照插件的IDE

    5. 取名、代码标准
        0) Google Python Style Guide
        1卡塔尔 PEP8 Python编码标准
        2卡塔尔 使用pylint、pyflakes、PEP8代码风格检查工具、isort 对import语句分段排序工具、clonedigger代码重复率查询等工具检查代码

    6. 注释、文档
        0卡塔尔 文档包含注释和文书档案字符串,日常在变量名、函数名、模块名和类名中
        1)Python唯有单行注释,对于''''''的文书档案字符串也可看作注释;然而不太提出,代码风格也许不太正统

    7. 测量试验代码
        0卡塔尔(قطر‎ 对于简易的单个模块可用:if __name__ == '__main__'内容中增加测量试验内容也可
        1卡塔尔(英语:State of Qatar)标准库中的doctest测量检验包,把测验写到文档字符串中也起到自然的文书档案表达的效果与利益,其粤语档字符串内容为:
          字符 >>> 后边是叁个函数调用,下意气风发行是期望的实行结果,自此调用doctest.testmod(卡塔尔国并在施行时扩展-v选项就能够
        2卡塔尔国规范库中的unittest模块实行单元测量检验,其供给实现该蕴涵测量试验方法的世袭类,今后调用unittest.main(卡塔尔国实行全体的测验用例
        3卡塔尔国第三方的测验包nose,其只须要使得以test开始的函数作为测量检验用例;测量试验文件xxx.py无需写if __name__ == '__main__',
          从此举行nosetests xxx.py就可以
        4卡塔尔 集成测量试验Test Discovery,可测验项目中多个测量试验用例文件;使用方式:python -m unittest discover
        5卡塔尔 各样Python测量试验框架,如pytest、tox框架

    8. 持续集成(自动化创设、测量检验系统卡塔尔国
        0) buildbot
        1) jenkins
        2) travis-ci
        3卡塔尔国 coverage代码覆盖率测量试验工具
        4) tox

    9. 调度代码
        0卡塔尔 最相通的正是在要求的地点调用print打字与印刷消息
        1卡塔尔(英语:State of Qatar)vars(卡塔尔函数调用可打字与印刷参数列表内容,结合装饰器就能够方便在调用实际函数前后打印、获取有个别音信只怕推行调用别的函数
        2卡塔尔(قطر‎ 使用pdb调节和测验器,使用办法:python -m pdb xxx.py

    10. 日记记录
        0卡塔尔 简单的用print打字与印刷新闻至调节台大概文件
        1卡塔尔 使用规范库中的logging模块,提供打字与印刷等级、格式、指标、过滤器等

    11. 优化代码
        0卡塔尔(英语:State of Qatar) 平日景色下是先优化算法、数据构造;
        1卡塔尔国使用正式库time模块的time函数衡量实行时间,计算时间差可粗略总结实行时间
        2卡塔尔国 使用正式库timeit模块的timeit函数可总结测量试验代码片段的实行时间
        3卡塔尔(英语:State of Qatar) 使用正规库timeit模块的repeat函数可反复测验代码片段
        4) 优化小tips:
          0. 优化数据结构,举个例子:列表深入深入分析日常比for循环自个儿添英镑素越来越快
          1. 优化算法
          2. Cython用来生成C增加,Python中接收C写成的库(与CPython不相同,后面一个为Python暗许完成的解释器卡塔尔(英语:State of Qatar)
          3. 其它一些总结的数学库,还是能够运用NumPy(C语言完毕卡塔尔(英语:State of Qatar)
          4. 对于一些通过解析器解析获得真正必要加强质量的有个别能够利用C扩充来兑现,以抓好性能
          5. 利用标准库ctypes模块整合C语言库的贯彻
          6. 行使PyPy拆解分析器(由Python实现的分析器,内部可能用到JIT即时解析器、沙盒等卡塔尔,其比CPython解释器越来越快

    12. 源码调整
        0) Git
        1) SVN
        2) CVS
        3) Mercurial(Hg)
        4) 其他

    13. 次第打包
        0卡塔尔(英语:State of Qatar) Distutils打包程序
        1卡塔尔 结合0卡塔尔(英语:State of Qatar)使用sdist命令打包
        2卡塔尔(英语:State of Qatar) 结合0卡塔尔国使用bdist命令打包并创设安装程序
        3卡塔尔(قطر‎ 结合0卡塔尔国使用扩张python,供给提供setup.py,build_ext命令打包
        4卡塔尔(قطر‎ 使用py2exe品级三方工具创设可执路程序,近似也须求提供setup.py
        5卡塔尔国 其余第三方卷入工具

    14. 某些不错的Python学习财富照旧别的相关资料
        0)
        1)
        2)
        3)
        4)
        5)
        6)

    转载自:

    写在头里的话

      首先自身一定要重申,万豆蔻梢头您以为反常,那明确是你从未当真看下边的辨证。

      先说一点题外话,从下周职务分配下来到近年来,必要在随地随时改换,描述也丰硕模糊。既然那只是二十二日的“小作业”,那么就未有供给把供给模糊化,对于任何一点认证都应有切实清晰,给出的样例必需正式准确,並且只要那门学科的重视在软件品质提高和测验上,那么就不应有在急需上期期艾艾,那样对大家的支付特不利。那点恐怕给开拓产生了十分大的标题。

    软件性能与测试 第二周作业 WordCount

    目录

    PSP表格

    PSP2.1

    PSP阶段

    预估耗时

    (分钟)

    骨子里耗时

    (分钟)

    Planning

    计划

     

     

    · Estimate

    · 揣测那几个职务供给有个别日子

     15

     15 

    Development

    开发

     

     

    · Analysis

    · 必要剖析 (包括学习新技能卡塔尔(英语:State of Qatar)

     60

     80

    · Design Spec

    · 生成设计文书档案

     -

    · Design Review

    · 设计复审 (和共事核实规划文书档案卡塔尔

     -

    · Coding Standard

    · 代码标准 (为当下的成本制定合适的正规卡塔尔(英语:State of Qatar)

    · Design

    · 具体统筹

     60

     90

    · Coding

    · 具体编码

     500

     450

    · Code Review

    · 代码复审

     60

     40

    · Test

    · 测验(自己测量试验,改过代码,提交修正)

    第二周作业,一步一步教你编写与搭建自动化测试框架。 120

     120

    Reporting

    报告

     

     

    · Test Report

    · 测量试验报告

     120

     140

    · Size Measurement

    · 总括工作量

     20

     15

    · Postmortem & Process Improvement Plan

    · 事后计算, 并建议进度校勘陈设

     30

     30

     

    合计

    985

    980

    Github地址:

     

    Auty文件夹布局介绍

    统筹思路表达

    1. 率先只考虑多少个幼功作用:总结字符数、单词数、行数,计算结果以内定格式输出到暗中认可文件中。

      那么首先想到的自然是模块化,对于上述分化的成效分别组织相应的单身的艺术。笔者个人是不支持方法的嵌套的,因为不菲时候会引致思路的混杂,并且假诺主旨成效出了难点,别的模块也就整个崩溃了。

      于是这里就从头利用python的公文管理效果以致重返的公文句柄的措施来张开始拍摄卖。

    (1)首先是总括字符效率,非常粗略f.read(卡塔尔国再次来到叁个文本原原本本的字符串,包罗n,t等空白字符,因而只需求总结重返的字符串的长度就足以了。

    说明:这里的n,t均只视作八个字符。

    1 # return the character number of a file
    2 def char_num():
    3     # open the file with the name 'filename'
    4     f = open(filename, 'r')
    5     totalstr = f.read()
    6     f.close()
    7     return filename   ', 字符数:'   str(len(totalstr))
    

    (2)然后是总结行数功用,另三个办法f.readlines(卡塔尔(قطر‎再次回到叁个文书各行组成的列表,只须求总结列表成分个数就可以。

    1 # return the line number of a file
    2 def line_num():
    3     # open the file with the name 'filename'
    4     f = open(filename, 'r')
    5     lines = f.readlines()
    6     f.close()
    7     return filename   ', 行数:'   str(len(lines))
    

    (3)总结单词数有几许头眼昏花,但也很简短,大家在地点重临的每意气风发行中张开检索,查找的正经八百正是正则表明式:单词是由最少三个假名组成的且不含其余标记(不思考不定冠词a,连接词如five-year-old,缩写如don't这几类特别词汇)。于是用re.findall(r'[A-Za-z]{2, }'卡塔尔就足以筛选出富有的单词了。

     1 # return the word number of a file
     2 def word_num():
     3     # open the file with the name 'filename'
     4     f = open(filename, 'r')
     5     lines = f.readlines()
     6     f.close()
     7     # get the word by regex expression
     8     linewords = []
     9     for i in range(0, len(lines)):
    10         linewords.append(re.findall(r'[A-Za-z]{2,}', lines[i]))
    11     # count the number of words
    12     count = 0
    13     for lineword in linewords:
    14         for word in lineword:
    15             if word.isalpha() == False or len(word) == 1:
    16                 lineword.remove(word)
    17         if lineword != ['']:
    18             count  = len(lineword)
    19     return filename   ', 单词数:'   str(count)
    

    (4)写入文件利用f.write(卡塔尔国方法就可以写入了,注意展开时的mode必需是a(追加),否则会抹掉以前全数的记录。

    1 # write the information to the file
    2 def write_file(filename, info):
    3     f = open(filename, 'a')
    4     f.write(info)
    5     f.close()
    

      那多少个部分的兑现还算比较简单。可是鲜明这个点子共用三个参数,所感到了便于起见,作者设计了两个类富含了有着的方法,具体内容请参见下面的链接。

    1. 接下去是关于扩展效率的表明

      增添成效为:递归管理目录下相符条件的文件;再次来到代码行/空行/注释行;忽视停用词表的单词(保留字)。

    (1)先从最简便的保留字管理发轫说,这些与事情未发生前单词管理很左近,不相同是要除掉保留字,于是咱们只须求布局一个保留字列表,决断获得的单词在不在表中,借使在则删掉,总计保留下来的单词数就能够,于是我们把此前的办法举办改写就可以。获取保留字的点子相仿于获取单词的经过:

     1 # get the preserved words list
     2 def get_prelist(fname):
     3     filename = join(sys.path[0], fname).replace('\', '\\')
     4     fhandle = open(filename, 'r')
     5     wholestr = fhandle.read()
     6     prelist = wholestr.split(' ')
     7     for word in prelist:
     8         if word == "" or word == "n" or word == "t":
     9             prelist.remove(word)
    10     return prelist
    

     (2)接下去说爱他美(Aptamil卡塔尔(英语:State of Qatar)下对行的确切总括专门的学业,正如大家在前头表达的,f.readlines(卡塔尔国重临的是一个由各行字符串组成的列表,那么大家对每一个字符串做一些管理:

      先选用str.replace(a, b卡塔尔方法将字符串中的换行符,制表符和空格全部去掉,接下去就实行推断:

      若果开首是'//'的话就当作注释行,不思谋多行注释;假设风姿罗曼蒂克行独有一个字符或还没字符就作为空行;其余任何视为代码行。

     1 # return line details of a file
     2 def line_detail():
     3     # open the file with the name 'filename'
     4     f = open(filename, 'r', encoding='utf-8')
     5     # get all line string into a list
     6     lines = f.readlines()
     7     f.close()
     8     # distinguish different lines
     9     codelines, emptylines, commentlines = [], [], []
    10     for line in lines:
    11         tmpline = line.replace(' ', '')
    12         tmpline = tmpline.replace('t', '')
    13         tmpline = tmpline.replace('n', '')
    14         if len(tmpline) == 1 or len(tmpline) == 0:
    15             emptylines.append(line)
    16         elif tmpline.startswith('//'):
    17             commentlines.append(line)
    18         else:
    19             codelines.append(line)
    20     return filename   ', 代码行/空行/注释行:'   str(len(codelines))   '/'
    21                   str(len(emptylines))   '/'   str(len(commentlines))
    

    (3)关于嵌套管理公事夹下全体的切合条件的公文,大家把标题打开分治:

      第大器晚成,咱们需求获得文件类型,那一个的思路比较轻易,大家在指令行中获取相应参数,利用字符串尾部截取就可以取得相应的文件类型。

      第二,大家依据获得的文件类型,在任何施行文书夹下进行递归查找,重返获得的文件的相对路线列表。

     1 # determine the type needed
     2 tmplist = desfile.split('.')
     3 type = '.'   tmplist[-1]
     4 # get the required list
     5 localinfo = directory.build_infolist(type)
     6 # build up the information list from the file list
     7 def build_infolist(type=''):
     8     filenames = build_filelist(type)
     9     dirnames = build_dirlist()
    10     # get information by creating a FileInfo object
    11     infos = []
    12     for fname in filenames:
    13         info = FileInfo(path, fname)
    14         infos.append(info)
    15     # deal with the inner directory
    16     for dirname in dirnames:
    17         new_path = join(path, dirname)
    18         newdir = DirInfo(new_path)
    19         new_infos = newdir.build_infolist(type)
    20         infos = infos   new_infos
    21     return infos
    

    3. 高端功效:展现图形分界面,客户通过分界面选拔单个文件,程序呈现相关总结新闻。

      相近是分治,生机勃勃部分是透过体现对话框获取文件路线和文书名,另豆蔻梢头有的正是将得到的新闻做地点的操作。

      难题在于呈现对话框,展现对话框要求运用wx库,利用内部的FileDialog方法创造对话框,FileDialog.getdirectory(卡塔尔国和FileDialog.getname(卡塔尔获取文件路线和文书名。给部分示范代码:

    瞩目:这里只展示字符数,行数,单词数(无保留字)

     1 # A method to get filename by dialog
     2 def dialog_get():
     3     app = wx.App()
     4     frame = wx.Frame(None)
     5     openwildcard = "All files(*.*)|*.*|"   
     6                     "C/C   files(*.c;*.cpp;*.h)|*.c;*cpp;*.h|"   
     7                     "Java source files(*.java)|*.java|"   
     8                     "Python source files(*.py)|*.py|"   
     9                     "Text files(*.txt)|*.txt"
    10     # Create open file dialog
    11     openFileDialog = wx.FileDialog(frame, "Choose a file to open",
    12                                    wildcard=openwildcard, 
    13                                    style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
    14     openFileDialog.ShowModal()
    15     dir = openFileDialog.GetDirectory()
    16     filename = openFileDialog.GetFilename()
    17     openFileDialog.Destroy()
    18     return dir, filename
    

    PSP2.1: 

    PSP2.1 表格
    PSP 2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟)
    Planning 计划 30  30 
    · Estimate · 估计这个任务需要多少时间 30  30 
    Development 开发 300  540 
    · Analysis · 需求分析(包括学习新技术) 80  120 
    · Design Spec · 生成设计文档 10  10 
    · Design Review · 设计复审(和同事审核设计文档) 10  10 
    · Coding Standard · 代码规范(为目前的开发制定合适的规范) 10  10 
    · Design · 具体设计 10  40 
    · Coding · 具体编码 130  300 
    · Code Review · 代码复审 20  20 
    · Test · 测试(自我测试,修改代码,提交修改) 30  30 
    Reporting 报告 70  120 
    · Test Report · 测试报告 40  60 
    · Size Measurement · 计算工作量 10  20 
    · Postmortem & Process Improvement Plan · 事后总结,并提出过程改进设计 20  40 
      合计 400  690 

    Auty文件构造介绍

    源代码模块表明

    FileInfo.py   class FileInfo

    Attributes: path, fname, filename

    Methods: char_num(), word_num(prelist), 

    line_num(), line_detail(), write_info()

    DirInfo.py class DirInfo

    Attributes: path

    Methods: build_filelist(tyoe), build_dirlist(), build_infolist(type)

    ExtraOpt.py - Methods: get_prelist(fname), dialog_get()
    main.py - (No methods, but some important codes used as main() in java)

      最终实际上还会有一个setup.py文件用于将脚本文件打包成exe文件,但那不是我们贯彻项指标重要,因而并未有列出来。

    解题思路:

      1、将顺序的意义必要分为根底成效和开展成效,按前后相继顺序分别达成两局地的内容;

      2、先在IDE中达成对Computer中钦点目录下的公文的读写操作;

      3、编写程序,达成能够在Main函数的调用下独家精确运转各种幼功功效;

      4、编写程序,实今后尖峰推行该程序时,程序能够获取到极点输入的全方位参数,并能对极端所在的目录下的文书档案实行读写;

      5、调治Main函数中对各类职能的调用机制,使得在尖峰输入相应的参数时,程序能够健康实行所对应的成效;

      6、明显程序能够正确运维具有的根底意义后,把工程打包成.jar文件,再将.jar文件调换到.exe文件,在极限中运转.exe文件,确认保证.exe能够准确执行全部功底成效;

      7、基于落成根基效能的程序,实行扩张作用的程序的编写,完毕全部的强盛功用;

      8、分明程序能够正确运营具备成效后,把工程打包成.jar文件,再将.jar文件调换来.exe文件,在尖峰中运行.exe文件,确认保障.exe可以无误履行全体效率;

     

      本工程的仿照效法资料都是透过百度所查找的,均是博客

      查阅资料:

      

      

     

    Auty使用手续

    软件运转表达

    1. .exe文件运营注意要点:

      首先说雅培下将python脚本文件打包成exe文件的办法,事前你要设置py2exe库,然后构造七个setup.py文件用于打包,对于这么些文件用命令行运营:

    python <filename>.py py2exe
    

      setup.py文件组织能够是那样的:

    1 from distutils.core import setup
    2 import py2exe
    3 setup(console=["main.py"])
    

      那么打包出来的状态是何许的呢?打包进度先成立二个dist文件夹,然后将PythonXX原作件夹里的意气风发对文件复制到这里来,然后结构一些周转必需的注册表。大概的文件构造如下图所示:

    图片 1

       因而要是急需周转以来,必得把具有文件放在三个文书夹里,内容均在BIN文件夹里。别的运营和.exe文件运营相近。

    2. 假设.exe文件运维不了的话,能够下载__pycache__文件夹里的.pyc文件和main.py文件,放在四个文书夹下,用python命令运营。

      Python版本3.4之上,运转代码:

    python main.py [arguments]
    
    1. 假诺地方的都足够的话,保障Python 3.4 ,安装wxPython库,下载全数.py文件,运转main.py脚本,其余和2.中内容相符。

    次第设计完结进程:

      程序包括八个类,分别为Main、Action、Count和FileUtils

      Main:程序的主函数类,实现整个程序的全体作用的调用,在那之中带有以下情势:

        main(卡塔尔(قطر‎:作为主方法。

      Action:完成要试行功用的决断、各个总计作用的调用和终极的消息输出的功效,个中满含以下方法:

        judges(String[] commands卡塔尔(英语:State of Qatar):命令深入分析函数,对极端中传来的参数进行判定,总结必要进行的效果;

        do_thing(String[] orders卡塔尔:对亟待执行的效果与利益进行调用;

        write(String[] write_content):对write_content中的内容开展打字与印刷;

      Count:此类为本工程的重头戏,完结了-c, -w, -l, -o, -a, -e这几个功能的实现,个中富含以下方法:

        c(File file卡塔尔:总计文件中的字符数;

        w(File file卡塔尔(英语:State of Qatar):总结文件的单词数;

        l(File file卡塔尔:总计文件的行数;

        a(File file卡塔尔国:总括文件的代码行、空行和注释行的行数;

        we(File file, File stop卡塔尔(英语:State of Qatar):总结文件中除了停用词表中的停用词后,剩余的单词总量;

      FileUtils:此类实现了递归管理目录下相符条件的文书,个中包括以下办法:

        getFiles(File dir卡塔尔:递归管理dir目录下的富有文件,对以.c结尾的文本实行命令行中的操作;

     

    Auty编写进程

    测量试验进度规划

    1. 先证实一下写完之后对代码的始发评估:

    (1)命令行参数处理的协会相当不够优化,这些片段也非常不得已,小编利用的字典布局方法是将文件和对应操作参数关联,但这种是不是是最优办法,小编如故存疑,关于那一个上边需求参照他事他说加以考查DOS恐怕python终端的参数处理情势;

    (2)这里思量到生龙活虎种轻巧的情状,即文件都能打得开,未有增添相当管理体制,不过本身感到非常处理是必须的,时间少于未有加以康健。

    (3)文件安顿和模块化设计就像还会有后生可畏部分升任空间。

      综上所述,小编认为这里照旧要求做一些优化的,关于python debugger等等工具照旧要学一下的。

    1. 测量检验用例的打算格局:

      依照日常的思绪,

    (1)大家针对每种不一样的命令格式设计相对应的测量试验用例,在这里间有-c, -w, -l, -a, -e, -s, -x多少个照顾的命令行参数,对每三个参数起码设计三个测量试验用例;

    (2)对于每个参数的测验,大家必要提供四个不一样的文件举行,且必需小心到有个别边界条件的测量检验,如-c中对于特殊字符的测验,-e更改文件名是还是不是能导入保留字列表等。

      简单的讲便是指向性差异成效设计尽恐怕多的事态覆盖的测量试验用例,上面给出的只是一个粗略的亲自过问,具体的测量检验集复杂得多。

    1. 切切实实地度量试示例:篇幅有限,给出八个公文及一些结果显示:

    (1)图形分界面测量试验:命令:

    wc.exe -x
    

      file_1.c

    1 {1}
    2 2
    

      file_2.c

    1 a
    2 a/
    3 a b
    

      file_3.c

    1 ---
    2 
    

      呈现的分界面如下:

    图片 2

      输出的结果如下:

    1. 
    file_1.c, 字符数:5
    file_1.c, 行数:2
    file_1.c, 单词数:0
    2. 
    file_2.c, 字符数:8
    file_2.c, 行数:3
    file_2.c, 单词数:0
    3.
    file_3.c, 字符数:4
    file_3.c, 行数:1
    file_3.c, 单词数:0
    

    (2)单个文件命令测验:

      testfile.c

    1 {
    2 }//
    3 //
    4              a
    5 aasa//
    6 while and or if endif
    

      StopList.txt

    while if for
    

      那么测量试验各类命令:

    4. wc.exe -c testfile.c
    testfile.c, 字符数:52
    5. wc.exe -w testfile.c
    testfile.c, 单词数:6
    6. wc.exe -l testfile.c
    testfile.c, 行数:6
    7. wc.exe -a testfile.c
    testfile.c, 代码行/空行/注释行:3/2/1
    8. wc.exe -w testfile.c -e StopList.txt
    testfile.c, 单词数:4
    9. wc.exe -s -c -w -l *.c -e StopList.txt
    file_1.c, 字符数:5
    file_1.c, 单词数:0
    file_1.c, 行数:2
    file_2.c, 字符数:8
    file_2.c, 单词数:0
    file_2.c, 行数:3
    file_3.c, 字符数:4
    file_3.c, 单词数:0
    file_3.c, 行数:1
    testfile.c, 字符数:52
    testfile.c, 单词数:4
    testfile.c, 行数:6
    10. wc.exe -c -w -l -a testfile.c -o result.txt
    testfile.c, 字符数:52
    testfile.c, 单词数:6
    testfile.c, 行数:6
    testfile.c, 代码行/空行/注释行:3/2/1
    

    图片 3

      这里显得的不利的结果,进度中出过多少个难点并改进过来了:

    1)-e 进度文件不能够读取:原因:get_prelist(卡塔尔(قطر‎获取路线错误,打包成exe后路线须求再一次定向

      消除措施:把cur_file_dir(卡塔尔(英语:State of Qatar)放到ExtraOpt.py中央银行使该办法渠道就重新调好了。

    2)-w -e重复输出:原因:七个设置在不一致的推断典型中,并不曾同期决断。

      消除措施:把关于保留字列表的管理放在-w的管理进度中,-e单独赢得列表。

      近日还不曾现身此外标题,然则无可否认要瞩目命令行的不易接纳,错误的命令行得不到正确的结果。

    代码表达:

    主函数:创建Action类的实例ac,通过ac调用Action中的命令深入分析、结果打字与印刷和意义调用这个方法;

     1 public static void main(String[] args) {
     2 
     3         String[] commands = new String[10];
     4         String print_content = null;
     5         String[] lastone = new String[2];
     6 
     7         Action ac = new Action();
     8 
     9         commands = ac.judges(args);
    10 
    11         if (commands[6].equals("true") && commands[7].endsWith(".c")) {
    12             FileUtils fu = new FileUtils(commands);
    13             print_content = fu.all_content;
    14         } else {
    15             print_content = Action.do_thing(commands);
    16         }
    17 
    18 
    19         lastone[0] = commands[8];
    20         lastone[1] = print_content;
    21 
    22         ac.write(lastone);
    23 
    24     }
    

    命令深入分析函数:对args[]字符串数组中的参数进行推断,依次得到args[]中的每一个参数并将其与"-c", "-w", "-l", "-o", "-a", "-e", "-s"那7个字符串举办相比较,决定程序必要对文本实行-c, -w, -l, -o, -a, -e, -s中的哪些功能;此外通过推断args[]中是不是留存卓绝的字符串判别命令行输入是不是有误,选择以".txt"和".c"结尾的,获取.c和.txt文件的文书名,最后将剖断后所得的结果重回;

      1 public String[] judges(String[] commands) {
      2 
      3         String[] output = new String[10];
      4 
      5 //        ArrayList<Object> output = new ArrayList<Object>();
      6 
      7         boolean error = false;
      8         boolean l = false;       //1
      9         boolean w = false;       //2
     10         boolean c = false;       //3
     11         boolean o = false;       //4
     12         boolean a = false;       //5
     13         boolean e = false;       //6
     14         boolean s = false;       //7
     15 
     16         String in_file = null;   //8
     17         String out_file = null;  //9
     18         String stop_file = null; //10
     19 
     20         String path = null;
     21 
     22         //保证输入的参数无重复
     23         for (int i = 0; i < commands.length - 1; i  ) {
     24             for (int j = i   1; j < commands.length; j  ) {
     25                 if (commands[i].equals(commands[j])) {
     26                     error = true;
     27                     break;
     28                 }
     29             }
     30             if (error) {
     31                 break;
     32             }
     33         }
     34 
     35         if (!error) {
     36             for (int i = 0; i < commands.length; i  ) {
     37                 if (commands[i].equals("-l")) {
     38                     l = true;
     39                 } else if (commands[i].equals("-w")) {
     40                     w = true;
     41                 } else if (commands[i].equals("-c")) {
     42                     c = true;
     43                 } else if (commands[i].equals("-a")) {
     44                     a = true;
     45                 } else if (commands[i].equals("-e")) {
     46                     e = true;
     47                     i = i   1;
     48                     stop_file = commands[i];
     49                     if (!stop_file.contains(".txt")) {
     50                         error = true;
     51                         break;
     52                     }
     53                 } else if (commands[i].equals("-o")) {
     54                     o = true;
     55                     i = i   1;
     56                     out_file = commands[i];
     57                     if (!out_file.endsWith(".txt")) {
     58                         error = true;
     59                         break;
     60                     }
     61                 } else if (commands[i].equals("-s")) {
     62                     s = true;
     63                 } else if (commands[i].endsWith(".c")) {
     64                     in_file = commands[i];
     65                 } else {
     66                     error = true;
     67                     break;
     68                 }
     69             }
     70 
     71 
     72             File directory = new File("");
     73             try {
     74                 path = directory.getAbsolutePath();
     75             } catch (Exception e1) {
     76                 e1.printStackTrace();
     77             }
     78 
     79 
     80             //确定要写的文件
     81             if (!o) {
     82                 out_file = "result.txt";
     83             }
     84 
     85 
     86             //确定停用词文件
     87             File file_stop = null;
     88             if (e) {
     89                 //设置停用词表
     90                 file_stop = new File(path   "/"   stop_file);
     91 
     92                 if (!file_stop.exists()) {
     93                     error = true;
     94                     System.out.println("停用词表不存在!");
     95                     System.exit(0);
     96                 }
     97             }
     98 
     99             if (l) {
    100                 output[0] = "true";
    101             } else {
    102                 output[0] = "false";
    103             }
    104 
    105             if (w) {
    106                 output[1] = "true";
    107             } else {
    108                 output[1] = "false";
    109             }
    110 
    111             if (c) {
    112                 output[2] = "true";
    113             } else {
    114                 output[2] = "false";
    115             }
    116 
    117             if (o) {
    118                 output[3] = "true";
    119             } else {
    120                 output[3] = "false";
    121             }
    122 
    123             if (a) {
    124                 output[4] = "true";
    125             } else {
    126                 output[4] = "false";
    127             }
    128 
    129             if (e) {
    130                 output[5] = "true";
    131             } else {
    132                 output[5] = "false";
    133             }
    134 
    135             if (s) {
    136                 output[6] = "true";
    137             } else {
    138                 output[6] = "false";
    139             }
    140 
    141             output[7] = path   "/"   in_file;
    142             output[8] = path   "/"   out_file;
    143             output[9] = path   "/"   stop_file;
    144 
    145 
    146         } else {
    147             System.out.println("命令行输入有误!");
    148             System.exit(0);
    149         }
    150         return output;
    151     }
    

    结果输出函数:在调用该函数时收获要打字与印刷到.txt文件中的内容,通过java.IO.File类的不二秘技将结果打字与印刷到.txt文件中;

     1 public void write(String[] write_content) {
     2 
     3         //write_content[0] file  write_content[1] content
     4 
     5         //向文件中写入内容
     6 
     7         File write_file = new File(write_content[0]);
     8 
     9         if (!write_file.exists()) {
    10             try {
    11                 write_file.createNewFile();
    12             } catch (Exception e1) {
    13                 e1.printStackTrace();
    14             }
    15         }
    16         try {
    17 
    18             FileWriter fw = new FileWriter(write_file);
    19             BufferedWriter bufw = new BufferedWriter(fw);
    20             bufw.write(write_content[1]);
    21             bufw.close();
    22             fw.close();
    23         } catch (Exception e1) {
    24             e1.printStackTrace();
    25         }
    26         System.out.println("Succeed!");
    27     }
    

     

    递归管理函数:完结-s操作,以wc.exe所在的文本夹为源点,利用深度优先寻找,遍历wc.exe文件夹所在的目录下具有后缀名字为.c的文件,并对那些文件相继张开命令行所输入的操作,具体操作如下:

        1、遍历wc.exe所在的文本夹中的每一个文件,剖断其是还是不是为文件恐怕文件夹;

        2、若为文件则对其开展命令行所输入的操作;

        3、若为文件夹则得到在那之中装有文件,并对每三个文书举办第11中学操作;

     1 public void getFiles(File dir) {
     2         if (dir.exists()) {
     3             //判断是否是目录
     4             if (dir.isDirectory()) {
     5                 File[] files = dir.listFiles();
     6 
     7                 for (File file : files) {
     8                     getFiles(file);
     9                 }
    10             } else {
    11                 String inFile = dir.getAbsolutePath();
    12                 if (inFile.endsWith(".c")) {
    13                     arg[7] = inFile;
    14                     all_content = all_content   Action.do_thing(arg)   "n";
    15                     System.out.print("n");
    16                 }
    17             }
    18         }
    19     }
    

    -c, -w, -l, -o, -a, -e等的操作比较风流洒脱致,故选取-w所对应的函数举行比如;

    单词计算:完成-w的操作,先获得读入文件的有着剧情,再调用split(卡塔尔(قطر‎函数在" "和","处对具备剧情张开剪切,最终总括分割获得的字符串数组的长度,即为该文件中的单词数;

     1 public int w(File file) {
     2         //单词数
     3         int word_num = 0;
     4 
     5         //文本的全部内容
     6         String content = "";
     7 
     8         //file存在,读取内容
     9         if (file.exists()) {
    10             try {
    11                 FileReader fr = new FileReader(file);
    12 
    13                 BufferedReader bufr = new BufferedReader(fr);
    14                 String s = null;
    15 
    16                 //获取文本全部内容
    17                 while ((s = bufr.readLine()) != null) {
    18                     content = content   s;
    19                 }
    20                 bufr.close();
    21                 fr.close();
    22 
    23                 String[] words = content.split("[ ] |[,] ");
    24                 /*for (int i = 0; i < words.length; i  ) {
    25                     System.out.println(i   words[i]);
    26                 }*/
    27                 //获取单词数
    28                 word_num = words.length;
    29 //                System.out.println(word_num);
    30                 System.out.println(file.getName()   ",单词数:"   word_num);
    31             } catch (Exception e1) {
    32                 e1.printStackTrace();
    33             }
    34         } else {
    35             word_num = -1;
    36             System.out.println("文件不存在!");
    37         }
    38         return word_num;
    39     }
    

     

    先是篇——生成试行列表

    参照他事他说加以考察文献

    1. Python Essential Reference, Fourth edition, David M.Beazley

    2. Core Python Applications Programming, Third Edition, Wesley J. Chun

    3. Python Crash Course: A Hands-On, Project-Based **Introduction to Programming, **Eric Matthes

    测量试验设计进度:

    测量检验中针对用例覆盖全部支行的目标实行两全

    测验用比方下所示: 

     1 //下面测试-c字符统计功能
     2 if while else end
     3 
     4 
     5 //下面测试-w的单词统计功能
     6 interest ing
     7 interest
     8 ing
     9 
    10 
    11 //下面测试-a的空行/代码行/注释行的统计功能
    12 //空行测试
    13 
    14  }
    15 t
    16 
    17 //代码行测试
    18 if(){
    19 } else if(){
    20 } else{
    21 }
    22 
    23 //注释行测试
    24 s//
    25 //
    26      //
    27 
    28 
    29 //下面测试-e的排除停用词表中单词的统计功能
    30 typedef struct {
    31     int startvex;
    32     int endvex;
    33     int length;
    34 } edge;
    35 edge T[M];
    36 
    37 void main() {
    38     int dist[N][N] = {{0,   6, MAX,  7,  MAX},
    39                       {MAX, 0,   5,  8,  -4},
    40                       {MAX, -2,  0, MAX, MAX},
    41                       {MAX, MAX, -3, 0,  9},
    42                       {2,   MAX, 7, MAX, 0}};//图的邻接矩阵
    43     int d[N];
    44     int num = 0;
    45     num = BellmanFord(dist, d, 0);//计算下标为0的顶点到其它顶点的距离,num用于统计边数
    46     for (int i = 0; i < N; i  )//打印到各个顶点之间的距离
    47         printf("%d ", d[i]);
    48     printf("n");
    49     for (int j = 0; j < num; j  )//打印考虑过的边
    50         printf("start=%d,end=%d,lenth=%dn", T[j].startvex, T[j].endvex, T[j].length);
    51 }
    

    极端命令行输入:

     1 //单个功能测试
     2 wc.exe -l file.c
     3 wc.exe -c file.c
     4 wc.exe -w file.c
     5 wc.exe -a file.c
     6 wc.exe -o out.txt
     7 
     8 //组合功能测试
     9 wc.exe -l -c file.c
    10 wc.exe -l -w file.c
    11 wc.exe -l -a file.c
    12 wc.exe -c -w file.c
    13 wc.exe -c -a file.c
    14 wc.exe -w -a file.c
    15 
    16 wc.exe -l -w file.c -e stop.txt
    17 wc.exe -c -w file.c -e stop.txt
    18 wc.exe -w -a file.c -e stop.txt
    19 
    20 wc.exe -l -c -w -a file.c -e stop.txt
    21 
    22 wc.exe -l -c -w -a file.c -e stop.txt -o out.txt
    23 
    24 wc.exe -l -c -w -a -s *.c -e stop.txt
    25 wc.exe -l -c -w -a -s *.c -e stop.txt -o out.txt
    26 
    27 
    28 //错误测试
    29 //无读取的文件
    30 wc.exe -l -c
    31 wc.exe -l -w
    32 wc.exe -l -a
    33 wc.exe -c -w
    34 wc.exe -c -a
    35 wc.exe -w -a
    36 
    37 //有-e,但无停用词表文件名
    38 wc.exe -l -w file.c -e
    39 wc.exe -c -w file.c -e
    40 wc.exe -w -a file.c -e
    41 
    42 //有-o,但无输出文件名
    43 wc.exe -l -c -w -a file.c -e stop.txt -o
    44 wc.exe -l -c -w -a -s *.c -e stop.txt -o
    45 
    46 //有-s,但无"*.c"
    47 wc.exe -l -c -w -a -s -e stop.txt
    48 wc.exe -l -c -w -a -s -e stop.txt -o out.txt
    

    在终端中输入上述测验命令后,程序能够正常运行,且按自身自身对供给的知情,运营输出均不利。

    除此以外,在BIN文件夹中到场了.bat的测量试验脚本文件,双击他运营,通过对调节台的出口的对照,也可开展测试。

     

    其次篇——读取与实施脚本列表

    小结

      此番项目内容依旧相比充实的,聊起来大家都以快结束学业的人了,上过的课也都游人如织了,有阅世的人都知道,营造二个品种,不管它再小,有意或是无意地都会专心致志确认保证二个针锋相投清晰合理的构架。比很多决心的同窗写出来的代码都以模块划分非常明晰,布局分外规整的,其强健性和可重用性都相当高。这种做法往往就意味着更加高的专业量。找寻新闻或然微微困难的,在搜索引擎中国百货企业度归属最低一流,必应归于中间,google才是高端(纵然无法用),寻搜索来的平日不能够满足必要,需求大批量探寻和人工筛选。而像CSDN,搜狐,开源中中原人民共和国那些专门的职业网址上的博客抄袭转发的超级多,况兼改革的比超慢(大概以后大家都去做框架可能AI去了,没人管根底内容的换代),使用语言的性状非常多都以已经被淘汰的,新特点在法定文书档案上的辨证和范例并非那么好懂的(手册类的文书档案,又不是教材)。通常会冒出你想找黄金时代种功效的达成格局,跳出来的大致是污物音讯依旧无用的从头到尾的经过,能够说在支付进程中不小片段日子是萧疏在提取有用音信的进度上。

      可是做出来了整套经过依旧很值得的。不过话说回来,就算小编的测验方今从来不检查测验到难题,但要么供给尤其测验,尤其良莠不齐的测量检验用例是至关重要的。同理可得假若地方的策画进程或促成格局有何难点,希望大家多多点拨。

     

    参照他事他说加以考察文献链接:

    Git教程 - 廖雪峰的官网

    java获得当前路径的两种方法 - CSDN博客

    java.io.File类基本接收——遍历某路线的兼具文件夹及文件 - CSDN博客

    手把手教你怎样把java代码,打包成jar文件以至转换为exe可实行文件 - CSDN博客

    WordCount,第二周wordcount 软件品质与测量检验 第二周作业 WordCount Github地址: PSP2.1:...

    其三篇——增添极度管理与日志搜罗

    第四篇——生成测试结果报告

    第五篇——调用扶持、自动化安装库与安插表明

    第六篇——垃圾代码回笼、加多suite扶持

    第七篇——加多动作库和常量文件库

    Auty框架表现篇——python flask框架试行

    接口测量检验用例编写提议

    [正文来源天外归云的天涯论坛]

    这两日用python写了八个自动化测验框架,取名叫Auty。策动用来做Web方面包车型大巴接口测量检验,以下为Auty框架一步一步的搭建进度——

    图片 4

    先是在那间笔者要多谢自身的法师兄朱勃的辅导、沟通和援救!

    归来顶上部分

    Auty文件夹构造介绍

    1. actions文本夹:包括了和业务相关的包蕴可复用方法的台本文件,遵照作业的不等足以在actions文件夹下创设差异的作业文件夹;

    2. constants文件夹:包涵了常量开头化的python脚本文件,依照作业划分能够更创制子文件夹或七个常量文件;

    1. data文件夹:包蕴了测验用的数额;

    2. lib文件夹:包涵了扶助框架运营的python文件;

    3. log文件夹:富含了运转测验过程中变化的日志文件;

    4. results文件夹:满含了测量检验结果文件;

    5. scripts文件夹:满含了scripts文件夹和selections文件夹;

    1)scripts文件夹下满含了测验脚本(可凭仗作业划分成多少个子目录);

    2)selections文件夹下富含了suite文件(包蕴了亟需实行的剧本路线会集);

    1. utils文件夹:包蕴了和业务逻辑非亲非故的包括可复用方法的剧本文件;

    重临最上部

    Auty文件构造介绍

    1. Auty文件夹下:

    1)__init__.py文件:包构造所不能够缺乏文件(以下有所关乎可调用脚本的文本夹下均需有此文件);

    2)config.txt文件:Auty框架配置表达文件;

    3)recovery.py文件:垃圾代码回笼文件(用来回笼施行测量试验进度中因故障不能够自行删除的自动生成的代码);

    4)requirements文件:包蕴了框架所急需设置的python库音讯;

    5)setup.py文件:实施脚本以安装requirements文件中所包括的python库;

    6)start.py文件:施行脚本以运维接口自动化测量试验;

    1. lib文件夹下:

    1)exe_deco.py文件:满含修饰脚本运维时办法的公文;

    2)execute_selection.py文件:包罗运转suite集合下脚本方法的公文;

    3)generate_html.py文件:满含依照变化的csv格式测量试验结果文件生成html类型测量检验结果文件格局的公文;

    4)generate_result.py文件:富含生成csv格式测量检验结果方法的公文;

    5)read_selection.py文件:包罗读取可举行的脚本列表方法的文本;

    6)recovery_code.py文件:包涵放弃物代码回笼措施的文书;

    7)write_log.py文件:满含生成日志文件措施的文书;

    1. scripts文件夹下:

    1)create_selection.py文件:包括创建suite文件(all_scripts_selection.txt)方法的公文;

    回去顶部

    Auty使用手续

    1. 运行Auty/setup.py文件;

    2. 编写接口测量试验python脚本并放置Auty/scripts/scripts目录(或子目录)下;

    3. 运行Auty/scripts/create_selection.py文件生成Auty/scripts/all_scripts_selection.txt文件;

    4. 修改Auty/scripts/all_scripts_selection.txt文件自定义test_selection.txt文件(名字随意起)并内置Auty/scripts/selections文件夹下;

    1. 运营Auty/start.py文件最初接口自动化测量试验;

    2. 在Auty/results文件夹下生成的测量检验结果文件中查看测量检验结果。

    回去最上部

    Auty编写进程

    以此框架里scripts、utils、actions、contants三个文本夹中的内容是依靠实际专门的事行业内部容能够随便替换的,其余为Auty接口自动化测量试验框架要求的组成都部队分。由于后续开垦工作比较零碎,一些退换的代码不能够立即更新到以下各篇作品中。风行代码请见:Github

    率先篇——生成试行列表

    其次篇——读取与实践脚本列表

    其三篇——增加非凡管理与日志采摘

    第四篇——生成测量试验结果报告

    第五篇——调用扶持、自动化安装库与陈设表达

    第六篇——垃圾代码回收、添加suite扶助

    第七篇——增加动作库和常量文件库

    Auty框架表现篇——python flask框架施行

    回到顶端

    接口测量试验用例编写提出

    框架的出世从某种层面上讲也是为着让编写的代码特别标准化。抛开框架来讲,对于接口测验用例的编纂,照旧要付出以下建议

    1. 提到接口中的url,不要写死在case中,要由此常量访问,将url存款和储蓄在钦定constant文件中(以防接口域名改造等原因引致的不得维护);

    2. 测量试验用例中不要包涵测量试验数据等可变新闻,要设成变量,专门将变量的初步化工作在四个钦定的公文中成就;

    3. 测验用例中不要再一次粘贴大段代码逻辑(不低价代码的走查,会引致代码冗余并狠抓出错可能率),凡是能够复用的历程大器晚成律提取成方法,分类放置在钦命的贮存业务逻辑action的文件夹中;

    4. 关于注释:用语料定要合法,注释的意思越多是对外人来说的,要让别的人黄金时代看就懂;必必要切切实实详尽,不要话说四分之二;必需求岗位正确,注释下方代码逻辑必要求与注释内容相符并不是在讲明下方过了生机勃勃段代码后才起来注释所含有的剧情逻辑。

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:第二周作业,一步一步教你编写与搭建自动化测

    关键词: