fitnesse 中各类fit fixture的python实现

虽然网上都说slim效率很高,无奈找不到支持python的方法,继续用pyfit

1 Column Fixture

特点:行表格展现形式,一条测试用例对应一行数据

Wiki

!define COMMAND_PATTERN {python "%m" %p}

!define TEST_RUNNER {C:\Python27\PyFIT-0.8a2\fit\FitServer.py}

!path E:\selfworkspaces\fitTest

!|ColumnFixtureTest.AddTest |

| a| b| add?|

|1|2|3|

|1|3|3|

Python:

from fit.ColumnFixture import ColumnFixture

class AddTest(ColumnFixture):

_typeDict = {

"a":"Int",

"b":"Int",

"add":"Int",

}

def __init__(self):

ColumnFixture.__init__(self)

self.a=‘‘

self.b=‘‘

def add(self):

c=self.a+self.b

return c

Action Fixture

主要用于测试一系列事件流,可直接调用其他类进行测试

Wiki:

第一行填入ActionFixture

Start:调用的类名

Enter:传入的参数

Press:执行一个没有返回值的方法

Check:检查结果

Wiki:

!define COMMAND_PATTERN {python "%m" %p}

!define TEST_RUNNER {C:\Python27\PyFIT-0.8a2\fit\FitServer.py}

!path E:\selfworkspaces\fitTest

!| ActionFixture |

| start | ActionFixtureTest.AddTest| |

|enter|firstPart|1|

|enter|secondPart|2|

|press|join|

|check|together|3|

python:

from fit.Fixture import Fixture

class AddTest(Fixture):

_typeDict = {}

def __init__(self):

Fixture.__init__(self)

self.__first  = ""    #< Private attributes (Python convention).

self.__second = ""

self.__both   = ""

_typeDict["firstPart"] = "Int"

def firstPart(self, s):

self.__first = s

_typeDict["secondPart"] = "Int"

def secondPart(self, s):

self.__second = s

_typeDict["join"] = "Default"      #< AUTO-DETECT: None = void

def join(self):

self.__both = self.__first+self.__second

_typeDict["together"] = "Int"

def together(self):

return self.__both

3 Row Fixture

非常适用于测试一个列表,和column想比,row验证属性多了missing和surplus,missing表示期望有值,但是实际结果没有返回, surplus表示期望无值,但实际结果返回有值

使用时,如果被测对象有主键(比如id之类的),将主键放在最左侧,便于查看错误报告

Row Fixture 用于检查没有序列的列表,检查有序列的对象,要用ArrayFixture

Wiki:
!|RowFixtureTest.PayRecordTest|

|id|name|

|1|nxy|

|2|nxy|

|3|nxy|

Python:
from fit.RowFixture import RowFixture

class
PayRecordTest(RowFixture):

def getTargetClass(self):

return PayRecord

def query(self):

PayRecord.addId(1,"nxy")

PayRecord.addId(3,"nnn")

PayRecord.addId(4,"nxy")

return PayRecord.idList #< Return copy of
players

class
PayRecord(object):

_typeDict = {

"id":"Int"
,

"name":"String"

}

def __init__(self,id=0,name=""):

self.id=id

self.name=name

idList=[]

@classmethod

def addId(cls,id,name):

cls.idList.append(PayRecord(id,name))

4 Table Fixture

可用于需要自定义表格的解析方式,自由设计表格样式

Wiki:
验证总分数和平均分

!| TableFixtureTest |

| name| score|

|math|90|

|chinese|95|

|english|91|

|total|276|

|avg|92|

Python:
from
fitnesse.fixtures.TableFixture import TableFixture

import
types

class
TableFixtureTest(TableFixture):

def doStaticTable(self,
rows):

total=0

for row in range(1, rows-2):

total+=int(self.getText(row,
2))

totalTable = int(self.getText(rows-2, 1))

avg=total/(rows-3)

avgTable=int(self.getText(rows-1, 1))

if total==totalTable:

self.right(self.getCell(rows-2, 1))

else:

self.wrong(self.getCell(rows-2, 1), str(totalTable))

if avg == avgTable:

self.right(self.getCell(rows-1, 1))

else:

self.wrong(self.getCell(rows-1, 1), str(avg))


Comment

protected abstract void doStaticTable(int rows)

Table Fixture is an abstract class that you must derive from. You must override doStaticTable to perform the functions of the fixture. The number of rows in the table is passed in rows.

protected Parse getCell(int row, int column)

Returns the addressed table cell as a Parse.

protected String getText(int row, int column)

Returns the text within the addressed table cell.

protected boolean blank(int row, int column)

Returns true if the addressed table cell is blank.

protected void wrong(int row, int column)

Turns the addressed table cell red.

protected void right(int row, int column)

Turns the addressed table cell green.

protected void wrong(int row, int column, String actual)

Turns the addressed table cell red, and annotates it with the actuall value.

protected void ignore(int row, int column)

Turns the addressed cell gray.

protected int getInt(int row, int column)

Converts the addressed cell to an int, and returns it.

5 SetUpFixture

可以用来做测试数据的准备

Wiki:

!| SetUpFixtureTest |

| player | post code | balance |

| John Smith | SW4 66Z | 10.00 |

| Michael Jordan | NE1 8AT | 12.00 |

Python:

from fitLib.SetUpFixture import SetUpFixture

from domain.Player import Player

class SetUpFixtureTest(SetUpFixture):

_typeDict = {}

def __init__(self):

Player.players = []

_typeDict["playerPostCodeBalance.types"] = [ None, "String", "String", "Float" ]

def playerPostCodeBalance(self, name, postCode, balance):

Player.addPlayer(name, postCode, balance)

Player 类见RowFixture示例

6 CalculateFixture

用来验证一个或多个列的组合值,可以用columnFixture来完成,但代码要比column少

Wiki:

!|CalculateFixtureTest|

|firstPart|secondPart||together|

|Hello|World||Hello, World|

|Houston|We Have a Problem||Houston, We Have a Problem|

Python:

from fitLib.CalculateFixture import CalculateFixture

class CalculateFixtureTest(CalculateFixture):

_typeDict = {}

# JAVA: String togetherFirstPartSecondPart(String firstPart,String secondPart){

_typeDict["togetherFirstPartSecondPart.types"] = ["String", "String", "String"]

def togetherFirstPartSecondPart(self, firstPart, secondPart):

return "%s, %s" % (firstPart, secondPart)

7 DoFixture

用来描述故事型的测试,比ActionFixture更高效

如果DoFixture是测试页的第一个表,则他管理着整个测试页面,允许你将测试表分成多个fixture类型的表,使测试具有可读性

Wiki:

!|DoFixtureTest|

|fill|10|times with|x|

|check|char at|4|x|

|set list|A,B,C,D|

|show|char at|2|

Python:

from fitLib.DoFixture import DoFixture

from typeadapter import buildListTypeAdapterFor

class DoFixtureTest(DoFixture):

_typeDict = {

"letters": "String"

}

def __init__(self):

DoFixture.__init__(self)

self.letters = ""

_typeDict["fillTimesWith.types"] = [None, "Integer", "Char" ]

def fillTimesWith(self, count, c):

self.letters = c * count    #< FILL: Repeat char ``count`` times.

_typeDict["charAtIs.types"] = ["Boolean", "Integer", "Char" ]

def charAtIs(self, position, c):

return self.letters[position] == c

ARRAY_OF_CHAR_TYPE_ADAPTER = buildListTypeAdapterFor("Char")

_typeDict["setList.types"] = [ None, ARRAY_OF_CHAR_TYPE_ADAPTER ]

def setList(self, array):

self.letters = "".join(array)

_typeDict["charAt.types"] = [ "Char", "Integer" ]

def charAt(self, position):

return self.letters[position]

from fit.taBase  import StringAdapter, ListAdapter

from fit.taTable import typeAdapterTable

from fit.FitException import FitException

import types

def buildListTypeAdapterFor(scalarType, typeName=""):

"""Utility method to build a TypeAdapter for a list of scalarType."""

if not typeName:

typeName = "ListOf%s" % scalarType

return ListAdapter(None, "", typeName, { ".scalarType": scalarType })

class CharTypeAdapter(StringAdapter):

"""

    TypeAdapter for Character.

    Characters are normally not of interest in Python (you normally use strings).

    Therefore, Python has no seperate datatype for a character.

    In addition, a TypeAdapter for Character is also not provided by PyFIT.

    """

def parse(self, text):

text = text.strip()

if len(text) != 1:

raise FitException, ("ParseError CharValue", text)

return text[0]

def toString(self, c):

if isinstance(c, (types.IntType, types.LongType)):

return chr(c)

elif isinstance(c, types.StringTypes):

assert len(c) >= 1

return c[0]

else:

raise FitException, ("toString.ValueError CharValue", c)

typeAdapterTable["Char"] = CharTypeAdapter

8 ArrayFixture

用于严格有序的序列测试

Wiki

!include -seamless SetUpFixture

!|ArrayFixtureTest|

|name|post code|credit limit|

|John Smith|SW4 66Z|10|

|Michael Jordan|NE1 8AT|12|

其中setupFixture见1.5,player类见之前例子

Python:

from fitLib.ArrayFixture import ArrayFixture

from domain.Player import Player

class ArrayFixtureTest(ArrayFixture):

def __init__(self):

ArrayFixture.__init__(self)

self.paramCollection = Player.players

self.setActualCollection()

def getTargetClass(self):

return Player   #< TYPE-HINT: For ValueObject class.

9 Combination Fixture

CombinationFixture用于描述有两个参数的计算规则,如下面两个例子,除法和乘法,其中theFirst指第一列各值,theSecond指第一行各值

Wiki:

!|CombinationFixtureTest.DivisionTest|

|  |1 |2|3|

|6 |6 |3|2|

|12|12|6|4|

!|CombinationFixtureTest.MultiplicationTest|

|  |1 |2|3|

|6 |6 |12|18|

|12|12|24|3|

Python:

from fitLib.CombinationFixture import CombinationFixture

class DivisionTest(CombinationFixture):

_typeDict = {}

# PY3K: combine(theFirst : int, theSecond : int) : int

_typeDict["combine.types"] = [ "Int", "Int", "Int" ]

def combine(self, theFirst, theSecond):

return theFirst / theSecond

class MultiplicationTest(CombinationFixture):

_typeDict = {}

# PY3K: combine(theFirst : int, theSecond : int) : int

_typeDict["combine.types"] = [ "Int", "Int", "Int" ]

def combine(self, theFirst, theSecond):

return theFirst * theSecond

10 ConstraintFixture

与calculatefixture不同 的是,constraintfixture每一次计算期望值都为true

Wiki中都为输入值,代码需有一个返回布尔类型的方法

Wiki
!|ConstraintFixtureTest|

|firstPart|secondPart|

|1|2|

|2|3|

Python:

from fitLib.ConstraintFixture import ConstraintFixture

class ConstraintFixtureTest(ConstraintFixture):

_typeDict = {}

# PY3K: firstPartSecondPart(firstPart : int, secondPart : int) : bool

_typeDict["firstPartSecondPart.types"] = [ "Boolean", "Int", "Int" ]

def firstPartSecondPart(self, firstPart, secondPart):

return firstPart < secondPart

11 Fixture Arguments

表的第一行表示类名,在类名后面添加单元格传递参数

Arguments 可以参数化字符串,并且重复使用,比如可以向RowFixture传递参数,他的参数不是在构造函数里初始化,而是通过加载类初始化

Wiki:
!|ArgumentsTest|Hello You Houston We Have a Problem|

|word|

|Hello|

|World|

|Houston|

|We|

|Have|

|a|

|Problem|

|Problem|

Python:

from
fitLib.SetFixture import
SetFixture

import
types

class
Word(object):

"""Simple ValueObject class
to store a word as string."""

_typeDict = { "word": "String" }

def __init__(self,
word):

assert isinstance(word, types.StringTypes)

self.word = word

class
ArgumentsTest(SetFixture):

def getTargetClass(self):

return Word #< CLASS-HINT: For _typeDict lookup.

def doTable(self,
table):

wordSet = set()

for s in self.args:#*argslist

for word in s.split(" "):

wordSet.add( Word(word) )

# -- WEIRD: setActualCollection() takes no arg -> Preassign
first.

self.paramCollection = wordSet

self.setActualCollection()

SetFixture.doTable(self, table)

时间: 2024-10-29 10:48:09

fitnesse 中各类fit fixture的python实现的相关文章

django 中的延迟加载技术,python中的lazy技术

---恢复内容开始--- 说起lazy_object,首先想到的是django orm中的query_set.fn.Stream这两个类. query_set只在需要数据库中的数据的时候才 产生db hits.Stream对象只有在用到index时才会去一次次next. 例子: f = Stream() fib = f << [0, 1] << iters.map(add, f, iters.drop(1, f)) 1行生成了斐波那契数列. 说明: f是个lazy的对象,f首先放入

web工程中各类地址的写法

web工程中各类地址,最好以/开头开始前先想好:地址是给谁用的 服务器:/ == web应用 浏览器: / == 网站 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1,地址是给服务器用的 request.getRequestDispatcher("/foot.jsp").forward(req

在ubuntu linux 中编写一个自己的python脚本

在ubuntu linux 中编写一个自己的简单的bash脚本. 实现功能:终端中输入简单的命令(以pmpy为例(play music python),为了区别之前说的bash脚本添加了py后缀),来实现音乐的播放.注:本人ununut中安装了audacious,所以就以audacious为例,来实现音乐的播放. 第一步:进入一个目录,最好是自己特别选定的,如果用文件浏览器可以新建一个名为pmpy空白文档文件:如果是用终端可以输入命令:vi pmpy(可能会因为位置问题,需要添加sudo) 第二

python操作txt文件中数据教程[1]-使用python读写txt文件

python操作txt文件中数据教程[1]-使用python读写txt文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果 程序实现 filename = './test/test.txt' contents = [] DNA_sequence = [] # 打开文本并将所有内容存入contents中 with open(filename, 'r') as f: for line in f.readlines(): contents.append(line

beego中各类数据库连接方式

beego 框架是优秀得go REST API开发框架.下面针对beego中各类数据库连接操作做一个总结. 1. orm连接方式 beego中的orm操作支持三种数据库:mysql,sqlite3,postgersql.三种数据库的驱动如下: import ( _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" ) 对于以

MySQL中的分页操作结合python

mysql中的分页操作结合python --分页: --方式1: select * from ta12 limit 10;-- 读取十行 select * from ta12 limit 10,10 --从第十行读取 往后再读十行 --方式2: select * from ta12 limit 10 offset 20 ; --从第二十行开始读取10行 -- 结合python 分页: page = input('请输入要查看的页码') page = int(page) select * from

HTML中各类空格占位符

HTML中各类空格占位符 符号 表示 普通的英文半角空格       普通的英文半角空格但不换行   中文全角空格(一个中文宽度)     半角(en)空格 (半个中文宽度,不受字体影响)     全角(em)空格 (一个中文宽度,不受字体影响)   四分之一全角(em)空格 (四分之一中文宽度) 普通空格   相比普通空格,不间断,按下space键产生的空格,不累加 em是字体排印学的计量单位,相当于当前指定的点数.例如,1 em在16px的字体中就是16px. en是字体排印学的计量单位,为

Spark(Hive) SQL中UDF的使用(Python)

相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内置的各类UDF也为我们的数据处理提供了不少便利的工具,当这些内置的UDF不能满足于我们的需要时,Hive SQL或Spark SQL还为我们提供了自定义UDF的相关接口,方便我们根据自己的需求进行扩展. 在Hive的世界里使用自定义UDF的过程是比较复杂的.我们需要根据需求使用Java语言开发相应的

Spark(Hive) SQL中UDF的使用(Python)【转】

相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内置的各类UDF也为我们的数据处理提供了不少便利的工具,当这些内置的UDF不能满足于我们的需要时,Hive SQL或Spark SQL还为我们提供了自定义UDF的相关接口,方便我们根据自己的需求进行扩展. 在Hive的世界里使用自定义UDF的过程是比较复杂的.我们需要根据需求使用Java语言开发相应的