Pysys。由于execute()发生错误,阻止执行validate()方法

时间:2016-05-04 15:45:18

标签: python unit-testing

我希望在validate()方法中以我预期的方式阻止执行我的测试用例的execute()方法...

我试图做类似以下的事情:

class MyTestCase(BaseTest):
   def execute(self):
      if somethingWentOK == False:
            self.addOutcome(BLOCKED)

并且,从validate()方法:

   def validate(self):
      if self.getOutcome()!=BLOCKED:
           doValidationStuff()
      else:
           self.log.error("Something failed!!!")

但我得到的输出与我的预期不同:

2016-05-04 17:25:36,892 ERROR Testcase execution interrupted by previous errors!
2016-05-04 17:25:36,911 INFO
2016-05-04 17:25:36,933 INFO  Test duration 51.48 secs
2016-05-04 17:25:36,948 INFO  Test final outcome NOT VERIFIED
2016-05-04 17:25:36,950 INFO
2016-05-04 17:25:37,025 CRIT
2016-05-04 17:25:37,026 CRIT  Test duration: 51.60 (secs)
2016-05-04 17:25:37,026 CRIT
2016-05-04 17:25:37,026 CRIT  Summary of non passes and tests requiring inspection:

我以为我会得到BLOCKED结果,而不是框架产生的NOT VERIFIED结果......

我知道我做的事情不合适,所以对此的任何反馈都可以理解。

1 个答案:

答案 0 :(得分:1)

基本测试类有一个属性self.outcome,它是一个结果列表,可以包含反向优先顺序中的任何以下值 - PASSED,INSPECT,NOTVERIFIED,FAILED,TIMEDOUT,DUMPEDCORE,BLOCKED和SKIPPED。在基本测试上调用addOutcome()时,可以向此列表添加值。

测试的总体结果是列表中具有最高优先级的条目,即如果列表包含[PASSED,FAILED,BLOCKED],则整体结果为BLOCKED。这是在基础测试上调用getOutcome()时返回的内容。 BLOCKED,DUMPEDCORE,TIMEDOUT,FAILED中的任何结果都被视为表示测试失败。在下面的示例中,应该执行您想要的操作,我们将BLOCKED添加到结果列表中,然后在validate方法中检查结果列表中是否存在BLOCKED条目,如果是,则跳过验证。

from pysys.constants import *
from pysys.basetest import BaseTest

class PySysTest(BaseTest):
    somethingWentOK=False
    def execute(self):
        if self.somethingWentOK == False:
            self.log.error("Adding BLOCKED outcome ...")
            self.addOutcome(BLOCKED)

    def validate(self):
        self.log.info("Performing validation ...")
        if not BLOCKED in self.outcome:
            self.doValidationStuff()
        else:
            self.log.error("Something failed!!!")

    def doValidationStuff(self):
        pass

...运行时给出以下输出;

C:\code\pysys-examples\tests>pysys.py run
2016:05:04 18:33:54 INFO  ==============================================================
2016:05:04 18:33:54 INFO  Id   : test_001
2016:05:04 18:33:54 INFO  ==============================================================
2016:05:04 18:33:54 ERROR Adding BLOCKED outcome ...
2016:05:04 18:33:54 INFO  Performing validation ...
2016:05:04 18:33:54 ERROR Something failed!!!
2016:05:04 18:33:54 INFO
2016:05:04 18:33:54 INFO  Test duration: 0.02 secs
2016:05:04 18:33:54 INFO  Test final outcome:  BLOCKED
2016:05:04 18:33:54 INFO
2016:05:04 18:33:54 CRIT
2016:05:04 18:33:54 CRIT  Test duration: 0.04 (secs)
2016:05:04 18:33:54 CRIT
2016:05:04 18:33:54 CRIT  Summary of non passes:
2016:05:04 18:33:54 CRIT    BLOCKED: test_001

PySys默认在计算总体结果和完成之前执行整个测试 - 即它不会像许多单元测试框架那样快速失败。在最新版本1.1中,存在快速语义失败,因此只要将结果添加到表示测试失败的结果列表中,测试就会立即完成。您可以使用-b选项,即;

,使用fail fast语义运行到pysys.py运行命令
C:\code\pysys-examples\tests>pysys.py run  -b true
2016:05:04 18:36:25 INFO  ==============================================================
2016:05:04 18:36:25 INFO  Id   : test_001
2016:05:04 18:36:25 INFO  ==============================================================
2016:05:04 18:36:25 ERROR Adding BLOCKED outcome ...
2016:05:04 18:36:25 INFO  Aborting test due to abortOnError set to true ...
2016:05:04 18:36:25 INFO
2016:05:04 18:36:25 INFO  Test duration: 0.02 secs
2016:05:04 18:36:25 INFO  Test final outcome:  BLOCKED
2016:05:04 18:36:25 INFO
2016:05:04 18:36:25 CRIT
2016:05:04 18:36:25 CRIT  Test duration: 0.04 (secs)
2016:05:04 18:36:26 CRIT
2016:05:04 18:36:26 CRIT  Summary of non passes:
2016:05:04 18:36:26 CRIT    BLOCKED: test_001

在这种情况下,您不需要在validate()方法中进行任何条件检查,因为一旦添加了BLOCKED结果,它就不会被执行。如果您希望在默认情况下启用此功能,则还可以在pysysproject.xml文件中进行设置。

property name="defaultAbortOnError" value="true"