一直在努力做测试的小白白
个人觉得使用python标准库中的Unittest搭建自动化测试框架很好用所以在这里做个笔记。
其实想要清楚Unittest内部逻辑看懂这张类图即可,夫图之缺如,岂不若言之大D,不多BB。
Unittest模块核心概念非为四层先后顺序可以为TestFixture->TestCase->TestSuite->TestRunner
Surprise MotherF*cker 跟这个图有什么关系呢?别急慢慢听我说。
Рисунок снизу вверх детали · TestCase — это просто тестовый пример, то есть полный процесс тестирования. Setup (подготовка тестовой среды) -> Run (запуск теста) -> Teardown (тест окончен, среда восстановлена) Суть Unittest тоже здесь, юнит неотделим, а юнит — это полноценный тестовый юнит. · TestSuite — это инструмент вложения, который может упаковывать тестовые наборы, классифицировать каждый тип модульного теста и т. д. PS: TestSuite может вкладывать TestSuite. Метод loadTestsFrom в TestLoader ищет TestCases и загружает их в TestSuites. TestRunner запускает TestCase в TestSuite и генерирует результат TestFixture — это создание и уничтожение среды для тестовых случаев.
После того, как класс наследует Unittest, это тестовый пример, и метод в классе (метод, начинающийся с имени теста) будет загружен в TestCase, и соответствующий экземпляр будет сгенерирован во время TestLoaderd, а затем, если он загружен в TestSuite , неизменяемый экземпляр
Процесс кардочесания: Завершите содержимое TestCase, загрузите его в TestSuite с помощью TestLoadFrom, а затем выведите результаты теста TestRunner в TestResult.
Юниттест экземпляр:
Тестируйте TestCase напрямуюНапишите метод для тестирования здесь
)Затем используйте Unittest для проверки этих методов.
PS: Чтобы добавить unittest.main(), нужно передать TestCase в TestRunner и распечатать результат в столбце результатов (вы также можете записать в файл), И вы можете добавить verbosity=0/1/2 в unittest.main() (число указывает на подробность журнала)
Упаковать TestCase в TestSuite и протестировать
Нецелесообразно использовать addTest() один за другим или записывать тестовые случаи в список. Лично я думаю, что реально вручную добавить тесткейс вот так! ! ! Проблема, поэтому используйте функцию загрузки, чтобы загрузить все слова со словом test в начале в тестовом примере.suite.addTests(unittest.TestLoader().loadTestsFromName('test_mathfunc.TestMathFunc'))
Таким образом, все контрольные примеры в экземпляре TestMathFunc в модуле test_mathfunc могут быть загружены.Порядок загрузки TestCases неупорядочен.Вы можете проверить результаты печати и определение, которое будет проверено в экземпляре TestCase.
распечатать журнал как документОчень удобно использовать с открытыми файлами для обработки файлового потока в питоне.Нет необходимости вручную закрывать и не нужно беспокоиться об утечках памяти.Все механизмы сборки мусора сделаны. (Во время собеседования вы можете спросить о механизме сборки мусора в питоне. Рекомендуется посмотреть. Поскольку арендодатель давно не использует Java, концепция механизма сборки мусора в куче ясна, но глубокий принцип не помню.Когда интервьюер спросит, скажу, что В настоящее время я знаю python, java давно не используется XXXXXXX) Добавьте следующую кодировку
with open('UnittestTextReport.txt', 'a') as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(suite)
Подготовка среды и восстановление TestFixtureЕсли у нас есть два таких теста, 1. Войдите на веб-сайт (правильная учетная запись и пароль) 2. Войдите на веб-сайт (недопустимое имя пользователя и пароль).Первый тестовый пример должен выйти из системы после первого тестового примера, лучше очистите кеш, а затем продолжите тест второго тестового примера. В это время в игру вступают setup() и TearDown() TestFixture.
def setUp(self):
print "do something before test.Prepare environment."
def tearDown(self):
print "do something after test.Clean up."
Добавьте его в тестовый пример, аналогично магическому методу, каждый раз, когда тестовый пример начинает проходить через процесс фреймворка unittest, он будет вызывать setup() в начале для создания среды инициализации, а в конце он будет восстанавливаться. среда, в которой только что начался тест.
Если мы хотим подготовить среду один раз перед выполнением всех случаев и очистить среду после выполнения всех случаев, мы можем использовать setUpClass() и tearDownClass():
class TestMathFunc(unittest.TestCase):
"""Test mathfuc.py"""
@classmethod
def setUpClass(cls):
print "This setUpClass() method only called once."
@classmethod
def tearDownClass(cls):
print "This tearDownClass() method only called once too."
...
Некоторые люди могут быть незнакомы или незнакомы с @classmethod. Что ж, теперь, когда мы пришли сюда, давайте вставим пункт знаний о python.
classmethod и staticmethod в python
@classmethod — это метод класса @staticmethod — это статический метод.
Так какая разница? Давайте напишем простой класс для наблюдения
class A(object):
def m1(self,n):
print("self:",self)
@classmethod
def m2(cls,n):
print ("cls:",cls)
@staticmethod
def m3(n):
print ("n",n)
a = A()
a.m1(1)
A.m2(1)
a.m3(1)
Выход
Вообще говоря, если вы хотите использовать метод определенного класса, вы должны создать экземпляр объекта этого класса, а затем вызвать метод в классе. Self привязывает метод к объекту. Этот результат показывает некоторые проблемы. Self должно быть Нет незнакомец привязан к объекту, созданному классом, а cls привязан к классу A.
Так в чем же разница между статическим методом и самопривязываемыми классами?, оба могут вызывать методы класса или свойства класса, создавая экземпляр object.classmethod(), но self может вызываться внутренне, в то время как staticmethod может полагаться только на первый метод.
Так в чем же разница между classmethod и staticmethod?Очевидно, что у каждого должны быть некоторые идеи.Как декоратор, classmethod может выполнить следующий оператор classmethod перед созданием экземпляра класса.Он принадлежит классу и может быть вызван с использованием имени класса, метода класса/атрибута класса.
Ну, одним словом. То есть staticmethod может быть статическим вызывающим свойством класса или объекта, но он не может быть вызван внутренне. Функция модификации метода класса заключается в том, что класс может быть вызван, а самая большая особенность self в том, что он можно вызвать внутрь.
Итак, какая польза от этого (классового метода)?
Правильно иметь такую проблему трех последовательных рабочих-мигрантов, см. следующий пример.
Пользовательский ввод — 2018 5 5, но если формат ввода изменен на 2018.5.5, лучше не изменять исходный конструктор при рефакторинге класса, а просто добавить classmethod и свою дополнительную функцию обработки. следующее:
После долгого круга я наконец вернулся и продолжил говорить Unittest
Что делать, если вы хотите перейти к определенному тестовому набору?
Декоратор пропуска может быть -->@unittest.skip
Просто так, чтобы вы могли видеть в таблице печати или в документации, что тестовый пример был пропущен. Всего есть три декоратора пропусков unittest.skip(причина) unittest.skipIf (условие, причина) unittest.skipUnless(условие, причина) skip пропускает безоговорочно, skipIf пропускает, когда условие имеет значение True, а skipUnless пропускает, когда условие имеет значение False. Выбирайте по своей ситуации.
в заключении:unittest — это среда модульного тестирования, которая поставляется с Python, и мы можем использовать ее в качестве организации прецедентов и среды выполнения для нашей среды автоматизированного тестирования. Процесс юниттеста: пишем TestCase, затем загружаем TestCase в TestSuite с помощью TestLoader, а затем запускаем TestSuite с помощью TextTestRunner, а результат выполнения сохраняется в TextTestResult, когда мы выполняем его через командную строку или unittest.main(), main будет вызовите TextTestRunner.run для выполнения, или мы можем выполнить вариант использования непосредственно через TextTestRunner. Класс, наследующий unittest.TestCase, представляет собой TestCase, в котором методы, начинающиеся с test, при загрузке загружаются как настоящий TestCase. Параметр verbosity может управлять выводом результатов выполнения, 0 — простой отчет, 1 — общий отчет, 2 — подробный отчет. Вы можете добавить случай или набор в набор через addTest и addTests, вы можете использовать метод loadTestsFrom__() TestLoader. Используйте setUp(), tearDown(), setUpClass() и tearDownClass(), чтобы настроить среду до выполнения варианта использования и очистить среду после выполнения варианта использования. Мы можем пропустить случай с помощью декораторов skip, skipIf, skipUnless или использовать метод TestCase.skipTest. Добавьте stream в параметр для вывода отчета в файл: вы можете использовать TextTestRunner для вывода txt-отчета.
Из-за того, что аспиранты арендодателя скрестили специальности с компьютером, многого еще не хватает, я планирую учиться сам, чтобы иметь возможность просматривать и записывать свой собственный процесс обучения.
Памятка: - Точно. Паркер был маленьким ребенком. Довольно хорошо играл на саксофоне. Вставал, чтобы играть на монтаже. И он облажался. И Джонс чуть не обезглавил его за это. И он смеялся за кулисами, плача, чтобы уснуть той ночью ", но что он делает на следующее утро? Он тренируется. Никогда больше над ним не смеяться. И он тренируется и тренируется, имея в виду одну цель. А через год он возвращается в Рено. И он выходит на на этой сцене, и он играет лучшее соло, которое мир когда-либо слышал.