设为首页 收藏本站
查看: 848|回复: 0

[经验分享] fitnesse 中各类fit fixture的python实现

[复制链接]

尚未签到

发表于 2015-11-29 13:50:44 | 显示全部楼层 |阅读模式
虽然网上都说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

2 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)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144961-1-1.html 上篇帖子: python 对象 下篇帖子: 可变多隐层神经网络的python实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表