澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:软件质量与测试,一步

  此番项目在github上的地点:

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

  1. Python安装
      官方网站提供三种办法,经常Windows下间接安装exe就可以;Linux下基本上自带python;此外也提供源码,也可自行编写翻译;
      若安装后不也许选拔,则检查一下情形变量是不是设置科学。
      额外:除了最重大的官方网址资料、文书档案外,Python的wiki也提供了众多立见到效果能的信息

  2. Python相关源码
      0) 标准库
      1) PyPi包索引(可经过pip工具安装)
      2) GitHub上的Python项目
      3) Code activestate上边的Python代码片段

  3. Python安装包
      0) msi或exe格式直接运维安装
      1) pip方式安装,pip install 可安装whl格式或新本子pip下可直接设置包PyPi下钦命的包
      2) easy_install 安装egg格式的包
      3) 对于提供源码的包,可经过python setup.py install 安装,常常会提供setup.py文件

  4. Python开荒景况
      0) vim /notepad /Sublime Text等一多姿多彩编辑器
      1) 自带的依据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) 标准库中的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) vars()函数调用可打印参数列表内容,结合装饰器就可以方便在调用实际函数前后打字与印刷、获取某个音讯只怕施行调用其余函数
      2) 使用pdb调试器,使用格局:python -m pdb xxx.py

  10. 日记记录
      0) 简单的用print打字与印刷音信至调控台大概文件
      1) 使用标准库中的logging模块,提供打字与印刷等级、格式、目的、过滤器等

  11. 优化代码
      0) 常常情状下是先优化算法、数据结构;
      1) 使用正规库time模块的time函数衡量实行时间,总结时间差可粗略总括实行时间
      2) 使用专门的工作库timeit模块的timeit函数可总结测量检验代码片段的施行时间
      3) 使用标准库timeit模块的repeat函数可再三测验代码片段
      4) 优化小tips:
        0. 优化数据结构,比方:列表深入深入分析经常比for循环自个儿添欧元素越来越快
        1. 优化算法
        2. Cython用来生成C增加,Python中利用C写成的库(与CPython非常的小器晚成致,后面一个为Python默许实现的解释器)
        3. 其余一些总括的数学库,还足以使用NumPy(C语言达成)
        4. 对此某个通过解析器深入分析获得实在需求进步质量的大器晚成都部队分能够行使C扩充来促成,以加强品质
        5. 应用标准库ctypes模块整合C语言库的兑现
        6. 施用PyPy解析器(由Python完毕的深入分析器,内部只怕用到JIT即时剖判器、沙盒等),其比CPython解释器更加快

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

  13. 程序打包
      0) Distutils打包程序
      1) 结合0)使用sdist命令打包
      2) 结合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

· 要求深入分析 (包涵学习新技艺)

 60

 80

· Design Spec

· 生成设计文书档案

 -

· Design Review

· 设计复审 (和共事核查规划文书档案)

 -

· Coding Standard

· 代码标准 (为当下的付出制订合适的正经)

· Design

· 具体两全

 60

 90

· Coding

· 具体编码

 500

 450

· Code Review

· 代码复审

 60

 40

· Test

· 测量检验(自己测量检验,改正代码,提交改良卡塔 尔(英语:State of Qatar)

 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卡塔尔国接下去表明风流倜傥(Wissu卡塔尔下对行的准确总括专门的学业,正如大家在前面表明的,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卡塔 尔(英语:State of Qatar)关于嵌套管理公事夹下全部的适合条件的文本,大家把标题展开分治:

  第生龙活虎,大家需求获得文件类型,这一个的思绪很简短,大家在指令行中获取相应参数,利用字符串尾部截取就能够得到对应的文件类型。

  第二,大家依据拿到的文件类型,在全部实施文书夹下进行递归查找,重回获得的文本的相对路径列表。

 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文件运维注意要点:

  首先说贝因美(Beingmate卡塔 尔(阿拉伯语:قطر‎下将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):命令分析函数,对终极中传来的参数进行剖断,计算要求实施的效果;

    do_thing(String[] orders):对亟待奉行的效果与利益实行调用;

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

  Count:此类为本工程的重心,完结了-c, -w, -l, -o, -a, -e那几个效能的完成,当中储存以下方法:

    c(File file):计算文件中的字符数;

    w(File file):计算文件的单词数;

    l(File file):总括文件的行数;

    a(File file):总计文件的代码行、空行和注释行的行数;

    we(File file, File stop):计算文件中除去停用词表中的停用词后,剩余的单词总量;

  FileUtils:此类完结了递归管理目录下切合条件的文件,个中积存以下方法:

    getFiles(File dir):递归管理dir目录下的享有文件,对以.c结尾的文书实行命令行中的操作;

 

Auty编写进程

测试进程设计

  1. 先说澳优(Dumex卡塔 尔(阿拉伯语:قطر‎下写完今后对代码的上马评估:

(1卡塔尔国命令行参数管理的构造非常不足优化,这几个局部也很万般无奈,笔者使用的字典构造方法是将文件和相应操作参数关联,但这种是或不是是最优办法,作者照旧存疑,关于这几个方面须求参谋DOS或然python终端的参数处理措施;

(2卡塔尔国这里思索到风流浪漫种简易的意况,即文件都能打得开,未有增加非凡管理体制,可是作者认为不行处理是必需的,时间有限未有加以康健。

(3卡塔尔国文件计划和模块化设计就好像还也可以有点调升空间。

  一言以蔽之,小编感到这里还是须要做一些优化的,关于python debugger等等工具依旧要学一下的。

  1. 测量试验用例的打算艺术:

  遵照平时的思路,

(1卡塔尔国我们本着每种分化的命令格式设计相呼应的测量检验用例,在那处有-c, -w, -l, -a, -e, -s, -x多少个照拂的命令行参数,对每一个参数起码设计三个测量检验用例;

(2卡塔 尔(英语:State of Qatar)对于每种参数的测验,我们必要提供四个不等的文本举行,且必需小心到一些边际条件的测验,如-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()放到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才是高档(尽管不能够用卡塔 尔(英语:State of Qatar),寻找出来的平时不能够满足必要,需求大量搜寻和人造挑选。而像CSDN,博客园,开源中黄炎子孙民共和国那几个规范网址上的博客抄袭转发的超多,并且校订的非常的慢(可能今后大家都去做框架只怕AI去了,没人管底蕴内容的翻新卡塔 尔(英语:State of Qatar),使用语言的特点超多都是早就被淘汰的,新特色在合阿拉伯语档上的印证和轨范并非那么好懂的(手册类的文书档案,又不是教材卡塔尔国。日常会产出你想找后生可畏种效应的落实方式,跳出来的大半是垃圾堆音信照旧无用的始末,能够说在开采进度中异常的大片段日子是疏落在提取有用消息的历程上。

  不过做出来了总体经过依旧很值得的。不过话说回来,尽管本身的测量检验近期不曾检查测验到标题,但要么须求更进一层测量试验,特别扑朔迷离的测量检验用例是少不了的。综上说述要是上面包车型大巴宏图进程或达成格局有如何难题,希望咱们多多指教。

澳门新浦京娱乐场网站:软件质量与测试,一步一步教你编写与搭建自动化测试框架。 

参谋文献链接:

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卡塔 尔(英语:State of Qatar)selections文件夹下包涵了suite文件(包罗了急需施行的本子路线集结卡塔 尔(阿拉伯语:قطر‎;

  1. utils文件夹:包蕴了和职业逻辑毫不相关的包蕴可复用方法的剧本文件;

回去顶端

Auty文件结构介绍

  1. Auty文件夹下:

1)__init__.py文件:包结构所必不可少文件(以下有所涉及可调用脚本的文本夹下均需有此文件卡塔尔;

2卡塔尔国config.txt文件:Auty框架配置表明文件;

3卡塔尔国recovery.py文件:垃圾代码回笼文件(用来回笼推行测验过程中因故障无法自动删除的自动生成的代码卡塔 尔(阿拉伯语:قطر‎;

4卡塔 尔(英语:State of Qatar)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文件(名字随便起卡塔 尔(英语:State of Qatar)并内置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. 测量检验用例中不要再次粘贴大段代码逻辑(不便利代码的走查,会招致代码冗余并加强出错可能率卡塔 尔(英语:State of Qatar),凡是足以复用的经过风姿罗曼蒂克律提取成方法,分类放置在钦命的贮存业务逻辑action的公文夹中;

4. 有关心释:用语肯定要合法,注释的意思越多是对人家来说的,要让别的人风姿罗曼蒂克看就懂;一定要切切实实详细,不要话说二分之一;必须求岗位精确,注释下方代码逻辑必供给予注释内容符合并不是在批注下方过了豆蔻梢头段代码后才起来注释所蕴含的剧情逻辑。

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:软件质量与测试,一步