4

I am on a website where you login, then search for course, click on course and then it lands on the Credit card page, since its just one course and is common and I am just trying to run DDT on CC section and not search section this is what I did.

On the test page this is how my code looks like:

@pytest.mark.usefixtures("oneTimeSetUp","setUp")
@ddt
class SendformTest(unittest.TestCase):
 @pytest.fixture(autouse=True)
 def classSetup(self,oneTimeSetUp):
 self.sf = SendForms(self.driver)
 self.ts = TestStatus(self.driver)
 def setUp(self): ############ I want this method to run just once after login, this method searches for course and then clicks and land on cc page
 self.sf.navigateToCCForms("img")
 @pytest.mark.run(order = 1)
 @data(*getCSVData("testRegular.csv"))
 @unpack
 def test_cc_Form(self,ccNum, ccExp, ccCVV):
 result = self.sf.verifyOnCCforms() 
 self.ts.mark(result,"On Send Form Page")
 self.sf.ccdetails(ccNum, ccExp, ccCVV)
 result1 = self.sf.sentSuccessMsg()
 self.ts.markFinal("test_sending_Form", result1, "this is test")

Right now this runs once fine and then just sits there, it wont enter data multiple times on the CC page. how do I make setUp method run just once. I tried:

@classmethod
def setUpClass(self):
 #super(SendformTest, self).setUpClass()
 self.sf.navigateToSendforms("img")

but getting the:

AttributeError: type object 'SendformTest' has no attribute 'sf'

alecxe
11.4k11 gold badges52 silver badges107 bronze badges
asked Feb 10, 2017 at 1:36
3
  • 1
    Your setup and teardown methods should not reference 'self' but rather 'cls'. Here is the link to the unittest doc - docs.python.org/3/library/unittest.html Commented Feb 11, 2017 at 11:21
  • I tried CLS but that didn't work Commented Feb 11, 2017 at 14:01
  • Same error? What does setUpClass look like right now? Commented Feb 11, 2017 at 14:07

2 Answers 2

1

The problem is that setUpClass is executed earlier than classSetup fixture, hence the AttributeError.

One workaround might be to manually allow this method to be executed once, something like:

def setUp(self): 
 if getattr(self, 'navigated'):
 return
 self.sf.navigateToCCForms("img")
 self.navigated = True

I would also try the setup_class() method supported by pytest, though I suspect you would get the same issue as with setUpClass.

answered Jul 29, 2017 at 2:30
0

You need to use setupClass to have something run once in the test class , setUp is run between each test. You don't use self in setupClass you use cls and need to bring it into the method. You also need to add the decorator to make it a class method not an instance method.

@classmethod def setupClass(cls): cls.sf = SendForms(self.driver) cls.ts = TestStatus(self.driver) cls.sf.navigateToSendforms("img")

answered Jan 26, 2018 at 11:43
2
  • anything you do at class level will be available as self when you are back in the methods and operating at instance level. Commented Jan 26, 2018 at 11:44
  • you might need to use the @classmethod decorator here but its not appropriate if you are using self because thats only for instances of the class. Commented Jan 26, 2018 at 11:45

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.