Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как при фейле базового теста не запускать все остальные?


(Romanchuk Katerina) #1
Вопрос: Как при фейле базового теста не запускать все остальные?

Давно пытаюсь решить проблему, пока не осилила. 
Подскажите пожалуйста способ не запускать тысячи тестов если зафейлился базовый кейс.

test_suites\basic\login.py
import unittest
class LoginBase(TestCaseBase):
    def testconnect(self):
       """Basic"""
       pass

test_suites\tests\tests.py
import unittest
class Example1233(TestCaseBase):
    @connect
    def testLoader123(self):
       """ TEST #1""""""
       pass


class Example6675(TestCaseBase):
    @connect
    def testLoader456(self):
       """TEST #2"""
       pass

    @connect
    def testLoader4556(self):
       """ TEST #3""""""
       pass

    @connect
    def testLoader4564(self):
       """ TEST # N""""""
       pass


Сейчас если connect фейлится, то фейлятся все тесты, это лишняя трата времени и лишня работа агента СI который запустил тесты.

В результяте запуска тестов
..\.. \python\python.exe ..\..\..\ python\Scripts\nosetests-script.py
--all-modules --with-path=. -v --nocapture
pause

получается очень очень много тестов и все FAIL
Basic ...FAIL
TEST #1 ...FAIL
TEST #2 ...FAIL
TEST #3 ...FAIL
TEST #N ...FAIL

Можно ли как-то сделать либо через батник либо через методы unittest чтоб первым делом запускался test_suites\basic\login.py
Если он ФЕЙЛ, то другие модули с тестами запускать не нужно.

Basic ...FAIL
TEST #1 ...FAIL
TEST #2 ...FAIL
TEST #3 ...FAIL
TEST #N ...FAIL


(Romanchuk Katerina) #2

вот хороший мануал помог:

http://gahcep.github.com/blog/2013/02/10/qa-in-python-unittest/


(Mykhailo Poliarush) #3

я так понимаю, что проблема уже решена

если не трудно, кинь сюда результат


(Mykhailo Poliarush) #4

 

а еще, я так понимаю, что тесты пишутся в стиле unittest, а просто запускаются с помощью nosetests?

вариантов решения есть несколько

1. сделать отдельный запуск на CI основного теста и если он прошел, то запускать следующий билд план. А если нет, то нет

2. использовать декорадоторы unittest.skip или unittest.skipIf

3. написать main функцию запуска одного теста, и прогона последующих тестов в зависимости от его результата

4. ну и можно написать програмный запуск тестов и для теста сделать декоратор @critical например и проверять, если для теста с @critical получили fail тогда останавливать весь прогон

 

а также в самом nose есть nose.plugins.skip, а там есть Skip, SkipTest

 


(Romanchuk Katerina) #5

Пропустила ответ на свое сообщение, мне стыдно(
Да спасибо! Самые простые способы - это 2 и 3.

Вот быстрый пример того как сделала я:

import unittest

class TestSmoke(unittest.TestCase):
“”“Smoke test”""

def test_1(self):
    self.failIfEqual(100, 100)

class OtherTest(unittest.TestCase):
“”“Some cases - not need to run them if smoke test fails”""

def test_2(self):
    self.assertListEqual([1, 2, 3], [1, 2, 3])

def test_3(self):
    self.assertListEqual([10, 6, 7], [10, 6, 7])

#################################################################################

if name == ‘main’:

tests = unittest.defaultTestLoader.loadTestsFromTestCase(TestSmoke)
smoke_tests = unittest.TextTestRunner(verbosity=2).run(tests)
smoke_result = unittest.TextTestResult.wasSuccessful(smoke_tests)

# wasSuccessful() - Return True if all tests run so far have passed, otherwise returns False.

if smoke_result:
    #If smoke tests pass successful run other:
    all_tests = unittest.defaultTestLoader.loadTestsFromTestCase(OtherTest)
    unittest.TextTestRunner(verbosity=2).run(all_tests)

(Romanchuk Katerina) #6

Результат если базовый тест прошел успешно:

test_1 (main.TestSmoke) … ok


Ran 1 test in 0.000s

OK
test_2 (main.OtherTest) … ok
test_3 (main.OtherTest) … ok


Ran 2 tests in 0.000s

OK