views:

57

answers:

1

Hello,

I have a Python script and I am trying to set a variable so that if the first test fail's the rest of then will be set to fail. The script I have so far is:

class Tests(unittest.TestCase):

    def result(self):
        ....This function does something[ignore]......
        someArg = 0


    def testPass(self):

        try:
            self.result()
        except suds.WebFault, e:
            assert False
        except Exception, e:
            pass
        finally:
            if someArg == 0:
                assert True
            else:
                global error
                error = False
                assert False  

    def testFail(self):

        try:
            self.result()
        except suds.WebFault, e:
            assert False
        except Exception, e:
            pass
        finally:
            if someArg == 0 or 'error' in globals():
                assert False
            else:
                assert True   


class Get(Tests):

    def runTest(self):

        self.testPass()


class GetFail(Tests):

    def runTest(self):


        self.errorHandle()   
        self.testFail()

if __name__ == '__main__':
    unittest.main()

I am trying to get self.error to be set to False if the first test fail. I understand that it is being set in another test but I was hoping someone could help me find a solution to this problem using some other means.

Thanks

PS. Please ignore the strange tests. There is a problem with the error handling at the moment.

+1  A: 

I'm having a hard time understanding your code, so let's pinpoint a few bits that I do understand (as it look like you may believe things are different from how they are).

The call

self.errorHandle()  

which you perform repeatedly works as a no-operation: the errorHandle method just does a return, the callers ignore the returned value, so that, net, "nothing happens" and you might as well avoid calling the method at all. What do you expect to happen when you call a method that just returns something and ignore the return value?

No idea where you're getting the someArg value -- I see it tested in two methods but never set. Is this maybe meant as pseudocode at some level...?

Not sure what the syntax of that def function(self) (i.e. result function...) is supposed to convey -- it's meant to be some kind of pseudocode, I'm sure, but what exactly?

If you can clarify these points -- most especially the first one about the errorHandle methods and the calls to it -- maybe it will be easier for us to offer assistance.

Alex Martelli
@Alex -- Sorry for the confusion, I will edit the code. someArg is another argument I had in there but I just put someArg in to pretend to be doing something. It's not actually the code that will be there. I changed the names of the functions and classes to generic terms so not to have alot of seperate functions that may confuse. I want to set `self.error` in `testPass()` and return it so when `testFail()` is called it can see the new value of `self.error` by calling `errorHandle`. I know this cannot be done the way I am doing it but I put in the code to try and explain what I was doing.Thanks
chrissygormley
@chrissy, test methods don't have usable return values when called from within the `unittest` framework, so your desire to "return" something from a `testWhatever` method, as stated, is simply unfeasible. (There's still way too much "pseudocode that can't possibly work" in your current edit for me to try to guess if by "return" you actually mean something different than `return`, sorry).
Alex Martelli
@Alex -- Sorry, basically I am trying to get this working that if the first test fail's there rest of the test's will automatically fail as well. As they should not pass if the first one has an error. But in the system the first test can fail and the others sometimes pass due to files in the system being at error. Is there any way of doing this? Thanks
chrissygormley
@chrissy, you could set a global or _class_ (**not** _instance_) variable to True on failure, and in every test in the sequence check that variable and fail fast if it's set to True. Just make sure to reset said variable to False at whatever you consider the "start" of a sequence of tests. Not all that different from what you're doing but absolutely no `return` involved (and, not an instance attribute, to make sure the attribute persists across tests -- depending on the test runner, you might lack such assurance for instance attributes).
Alex Martelli
@Alex -- I wrote the solution I tried, Thanks for all the help and patience :) +1
chrissygormley