Test before using что это
Тестирование в Java. JUnit
Сегодня все большую популярность приобретает test-driven development(TDD), техника разработки ПО, при которой сначала пишется тест на определенный функционал, а затем пишется реализация этого функционала. На практике все, конечно же, не настолько идеально, но в результате код не только написан и протестирован, но тесты как бы неявно задают требования к функционалу, а также показывают пример использования этого функционала.
Итак, техника довольно понятна, но встает вопрос, что использовать для написания этих самых тестов? В этой и других статьях я хотел бы поделиться своим опытом в использовании различных инструментов и техник для тестирования кода в Java.
Ну и начну с, пожалуй, самого известного, а потому и самого используемого фреймворка для тестирования — JUnit. Используется он в двух вариантах JUnit 3 и JUnit 4. Рассмотрю обе версии, так как в старых проектах до сих пор используется 3-я, которая поддерживает Java 1.4.
Я не претендую на автора каких-либо оригинальных идей, и возможно многим все, о чем будет рассказано в статье, знакомо. Но если вам все еще интересно, то добро пожаловать под кат.
JUnit 3
Для создания теста нужно унаследовать тест-класс от TestCase, переопределить методы setUp и tearDown если надо, ну и самое главное — создать тестовые методы(должны начинаться с test). При запуске теста сначала создается экземляр тест-класса(для каждого теста в классе отдельный экземпляр класса), затем выполняется метод setUp, запускается сам тест, ну и в завершение выполняется метод tearDown. Если какой-либо из методов выбрасывает исключение, тест считается провалившимся.
Примечание: тестовые методы должны быть public void, могут быть static.
Сами тесты состоят из выполнения некоторого кода и проверок. Проверки чаще всего выполняются с помощью класса Assert хотя иногда используют ключевое слово assert.
Рассмотрим пример. Есть утилита для работы со строками, есть методы для проверки пустой строки и представления последовательности байт в виде 16-ричной строки:
Напишем для нее тесты, используя JUnit 3. Удобнее всего, на мой взгляд, писать тесты, рассматривая нейкий класс как черный ящик, писать отдельный тест на каждый значимый метод в этом классе, для каждого набора входных параметров какой-то ожидаемый результат. Например, тест для isEmpty метода:
Можно разделить данные и логику теста, перенеся создание данных в метод setUp:
Дополнительные возможности
Кроме того, что было описано, есть еще несколько дополнительных возможностей. Например, можно группировать тесты. Для этого нужно использовать класс TestSuite:
Можно запустить один и тот же тест несколько раз. Для этого используем RepeatedTest:
Наследуя тест-класс от ExceptionTestCase, можно проверить что-либо на выброс исключения:
Как видно из примеров все довольно просто, ничего лишнего, минимум нужный для тестирования(хотя недостает и некоторых нужных вещей).
JUnit 4
Здесь была добавлена поддержка новых возможностей из Java 5, тесты теперь могут быть объявлены с помощью аннотаций. При этом существует обратная совместимость с предыдущей версией фреймворка, практически все рассмотренные выше примеры будут работать и здесь(за исключением RepeatedTest, его нет в новой версии).
Итак, что же поменялось?
Основные аннотации
Рассмотрим тот же пример, но уже используя новые возможности:
Если какой-либо тест по какой-либо серьезной причине нужно отключить(например, этот тест постоянно валится, но его исправление отложено до светлого будущего) его можно зааннотировать @Ignore. Также, если поместить эту аннотацию на класс, то все тесты в этом классе будут отключены.
Правила
Кроме всего вышеперечисленного есть довольно интересная вещь — правила. Правила это некое подобие утилит для тестов, которые добавляют функционал до и после выполнения теста.
Например, есть встроенные правила для задания таймаута для теста(Timeout), для задания ожидаемых исключений(ExpectedException), для работы с временными файлами(TemporaryFolder) и д.р. Для объявления правила необходимо создать public не static поле типа производного от MethodRule и зааннотировать его с помощью Rule.
Также в сети можно найти и другие варианты использования. Например, здесь рассмотрена возможность параллельного запуска теста.
Запускалки
Но и на этом возможности фреймворка не заканчиваются. То, как запускается тест, тоже может быть сконфигурировано с помощью @RunWith. При этом класс, указанный в аннотации должен наследоваться от Runner. Рассмотрим запускалки, идущие в комплекте с самим фреймворком.
JUnit4 — запускалка по умолчанию, как понятно из названия, предназначена для запуска JUnit 4 тестов.
JUnit38ClassRunner предназначен для запуска тестов, написанных с использованием JUnit 3.
SuiteMethod либо AllTests тоже предназначены для запуска JUnit 3 тестов. В отличие от предыдущей запускалки, в эту передается класс со статическим методом suite возвращающим тест(последовательность всех тестов).
Suite — эквивалент предыдущего, только для JUnit 4 тестов. Для настройки запускаемых тестов используется аннотация @SuiteClasses.
Enclosed — то же, что и предыдущий вариант, но вместо настройки с помощью аннотации используются все внутренние классы.
Categories — попытка организовать тесты в категории(группы). Для этого тестам задается категория с помощью @Category, затем настраиваются запускаемые категории тестов в сюите. Это может выглядеть так:
Parameterized — довольно интересная запускалка, позволяет писать параметризированные тесты. Для этого в тест-классе объявляется статический метод возвращающий список данных, которые затем будут использованы в качестве аргументов конструктора класса.
Theories — чем-то схожа с предыдущей, но параметризирует тестовый метод, а не конструктор. Данные помечаются с помощью @DataPoints и @DataPoint, тестовый метод — с помощью Theory. Тест использующий этот функционал будет выглядеть примерно так:
Как и в случае с правилами, в сети можно найти и другие варианты использования. Например, здесь рассмотрена та же возможность паралельного запуска теста, но с использованием запускалок.
Вывод
Это, конечно же, не все, что можно было сказать по JUnit-у, но я старался вкратце и по делу. Как видно, фреймворк достаточно прост в использовании, дополнительных возможностей немного, но есть возможность расширения с помощью правил и запускалок. Но несмотря на все это я все же предпочитаю TestNG с его мощным функционалом, о котором и расскажу в следующей статье.
Test before using что это
The rest of this manual will explain the following:
Annotations
@BeforeSuite @AfterSuite @BeforeTest @AfterTest @BeforeGroups @AfterGroups @BeforeClass @AfterClass @BeforeMethod @AfterMethod | Configuration information for a TestNG class: @BeforeSuite: The annotated method will be run before all tests in this suite have run. Behaviour of annotations in superclass of a TestNG class The annotations above will also be honored (inherited) when placed on a superclass of a TestNG class. This is useful for example to centralize test setup for multiple test classes in a common superclass. In that case, TestNG guarantees that the «@Before» methods are executed in inheritance order (highest superclass first, then going down the inheritance chain), and the «@After» methods in reverse order (going up the inheritance chain). testng.xmlYou can invoke TestNG in several different ways: This section describes the format of testng.xml (you will find documentation on ant and the command line below). The current DTD for testng.xml can be found on the main Web site: testng-1.0.dtd (for your convenience, you might prefer to browse the HTML version). Here is an example testng.xml file: testng.xmltestng.xmlIn this example, TestNG will look at all the classes in the package test.sample and will retain only classes that have TestNG annotations. You can also specify groups and methods to be included and excluded: testng.xmlYou can also define new groups inside testng.xml and specify additional details in attributes, such as whether to run the tests in parallel, how many threads to use, whether you are running JUnit tests, etc. By default, TestNG will run your tests in the order they are found in the XML file. If you want the classes and methods listed in this file to be run in an unpredictable order, set the preserve-order attribute to false testng.xmlPlease see the DTD for a complete list of the features, or read on. Running TestNGAssuming that you have TestNG in your class path, the simplest way to invoke TestNG is as follows: You need to specify at least one XML file describing the TestNG suite you are trying to run. Additionally, the following command-line switches are available: This documentation can be obtained by invoking TestNG without any arguments. You can also put the command line switches in a text file, say c:\command.txt, and tell TestNG to use that file to retrieve its parameters: Additionally, TestNG can be passed properties on the command line of the Java Virtual Machine, for example Here are the properties that TestNG understands:
Example: The ant task and testng.xml allow you to launch TestNG with more parameters (methods to include, specifying parameters, etc. ), so you should consider using the command line only when you are trying to learn about TestNG and you want to get up and running quickly. Important: The command line flags that specify what tests should be run will be ignored if you also specify a testng.xml file, with the exception of -includedgroups and -excludedgroups, which will override all the group inclusions/exclusions found in testng.xml. Test methods, Test classes and Test groupsTest methodsTest groupsTestNG allows you to perform sophisticated groupings of test methods. Not only can you declare that methods belong to groups, but you can also specify groups that contain other groups. Then TestNG can be invoked and asked to include a certain set of groups (or regular expressions) while excluding another set. This gives you maximum flexibility in how you partition your tests and doesn’t require you to recompile anything if you want to run two different sets of tests back to back. For example, it is quite common to have at least two categories of tests Test1.javatestng.xmlwill run all the test methods in that classes, while invoking it with checkintest will only run testMethod1() and testMethod2(). Here is another example, using regular expressions this time. Assume that some of your test methods should not be run on Linux, your test would look like: Test1.javatestng.xmlMethod groupstestng.xmlGroups of groupstestng.xmlExclusion groupsTestNG allows you to include groups as well as exclude them. For example, it is quite usual to have tests that temporarily break because of a recent change, and you don’t have time to fix the breakage yet. 4 However, you do want to have clean runs of your functional tests, so you need to deactivate these tests but keep in mind they will need to be reactivated. A simple way to solve this problem is to create a group called «broken» and make these test methods belong to it. For example, in the above example, I know that testMethod2() is now broken so I want to disable it: testng.xmlThis way, I will get a clean test run while keeping track of what tests are broken and need to be fixed later.
Partial groupsAll.javaParametersTest methods don’t have to be parameterless. You can use an arbitrary number of parameters on each of your test method, and you instruct TestNG to pass you the correct parameters with the @Parameters annotation. There are two ways to set these parameters: with testng.xml or programmatically. Parameters from testng.xmltestng.xmlThe same technique can be used for @Before/After and @Factory annotations:Parameters can be declared optional with the Optional annotation: If no parameter named «db» is found in your testng.xml file, your test method will receive the default value specified inside the @Optional annotation: «mysql». The @Parameters annotation can be placed at the following locations: Parameters with DataProvidersSpecifying parameters in testng.xml might not be sufficient if you need to pass complex parameters, or parameters that need to be created from Java (complex objects, objects read from a property file or a database, etc. ). In this case, you can use a Data Provider to supply the values you need to test. A Data Provider is a method on your class that returns an array of array of objects. This method is annotated with @DataProvider: By default, the data provider will be looked for in the current test class or one of its base classes. If you want to put your data provider in a different class, it needs to be a static method or a class with a non-arg constructor, and you specify the class where it can be found in the dataProviderClass attribute: StaticProvider.javaFor example, the following code prints the name of the test method inside its @DataProvider: and will therefore display: Data providers can run in parallel with the attribute parallel: Parallel data providers running from an XML file share the same pool of threads, which has a size of 10 by default. You can modify this value in the tag of your XML file: If you want to run a few specific data providers in a different thread pool, you need to run them from a different XML file. Parameters in reportsParameters used to invoke your test methods are shown in the HTML reports generated by TestNG. Here is an example:
DependenciesDependencies with annotationsYou can use the attributes dependsOnMethods or dependsOnGroups, found on the @Test annotation. In this example, method1() is declared as depending on method serverStartedOk(), which guarantees that serverStartedOk() will always be invoked first. You can also have methods that depend on entire groups: In this example, method1() is declared as depending on any group matching the regular expression «init.*», which guarantees that the methods serverStartedOk() and initEnvironment() will always be invoked before method1().
If a method depended upon fails and you have a hard dependency on it (alwaysRun=false, which is the default), the methods that depend on it are not marked as FAIL but as SKIP. Skipped methods will be reported as such in the final report (in a color that is neither red nor green in HTML), which is important since skipped methods are not necessarily failures. Both dependsOnGroups and dependsOnMethods accept regular expressions as parameters. For dependsOnMethods, if you are depending on a method which happens to have several overloaded versions, all the overloaded methods will be invoked. If you only want to invoke one of the overloaded methods, you should use dependsOnGroups. For a more advanced example of dependent methods, please refer to this article, which uses inheritance to provide an elegant solution to the problem of multiple dependencies. By default, dependent methods are grouped by class. For example, if method b() depends on method a() and you have several instances of the class that contains these methods (because of a factory of a data provider), then the invocation order will be as follows: TestNG will not run b() until all the instances have invoked their a() method. This behavior might not be desirable in certain scenarios, such as for example testing a sign in and sign out of a web browser for various countries. In such a case, you would like the following ordering: For this ordering, you can use the XML attribute group-by-instances. This attribute is valid either on or : Dependencies in XMLFactoriesTestWebServer.javatestng.xmlWebTestFactory.javaWebTest.javaYour testng.xml only needs to reference the class that contains the factory method, since the test instances themselves will be created at runtime: Or, if building a test suite instance programatically, you can add the factory in the same manner as for tests: The factory method can receive parameters just like @Test and @Before/After and it must return Object[]. The objects returned can be of any class (not necessarily the same class as the factory class) and they don’t even need to contain TestNG annotations (in which case they will be ignored by TestNG). Factories can also be used with data providers, and you can leverage this functionality by putting the @Factory annotation either on a regular method or on a constructor. Here is an example of a constructor factory: The example will make TestNG create two test classes, on with the constructor invoked with the value 41 and the other with 42. Class level annotationsTest1.javaTest1.javaIgnoring testsWhen used at the method level @Ignore annotation is functionally equivalent to @Test(enabled=false). Here’s a sample that shows how to ignore all tests within a class. TestcaseSample.javaTo ignore all tests in a particular package, you just need to create package-info.java and add the @Ignore annotation to it. Here’s a sample : package-info.javaParallelism and time-outsParallel suitesParallel tests, classes and methodsAdditionally, the attribute thread-count allows you to specify how many threads should be allocated for this execution.
Rerunning failed testsNote that testng-failed.xml will contain all the necessary dependent methods so that you are guaranteed to run the methods that failed without any SKIP failures. JUnit teststestng.xmlThe behavior of TestNG in this case is similar to JUnit depending on the JUnit version found on the class path: Running TestNG programmaticallySimilarly, you can invoke TestNG on a testng.xml file or you can create a virtual testng.xml file yourself. In order to do this, you can use the classes found the package org.testng.xml: XmlClass, XmlTest, etc. Each of these classes correspond to their XML tag counterpart. For example, suppose you want to create the following virtual file: You would use the following code: And then you can pass this XmlSuite to TestNG: Please see the JavaDocs for the entire API. использование @Before в тестировании Junit@Before нотация в JUnit Testing необходима, потому что несколько тестов нуждаются в похожих объектах, созданных до их запуска. Например, я тестирую свою шахматную программу и проверяю, перемещается ли мой объект фигуры в правильное место, выполняя: Так не сработает ли это, если я объявлю Board и Pawn p1 вне метода контрольного примера? Зачем нам нужен @Before в тестовом классе? Кроме того, это не сработает Я думал, что это на самом деле настроит объекты перед тестовыми примерами, так что мне не придется настраивать их в каждом тестовом случае, но тестовые примеры на самом деле не будут считывать объект p1 и плату. 3 ответа@Before аннотация используется для выполнения каких-либо действий перед выполнением каждого теста дело в вашем классе. В общем, вы на правильном пути. Чтобы ваш код работал, вам нужно объявить ваши Board и Pawn вне области действия функции. Допустим, все ваши тесты имеют некоторые общие настройки, которые необходимо выполнить перед запуском. Вы можете всегда просто создать какой-нибудь служебный метод setup и затем вызывать его вручную перед каждым классом: Аннотация @BeforeClass работает по аналогичной концепции, за исключением того, что она перехватывает весь пакет и запускается один раз. Лично я нахожу себя в этих ситуациях, когда мне приходится издеваться над зависимостями. Рассмотрим, например, класс, который зависит от соединения с базой данных. В моем @Before я создам поддельный экземпляр этого соединения с базой данных, который мои тесты могут вводить / использовать по мере необходимости: Аннотированный метод @Before выполняется перед каждым вызовом @Test Поэтому я решил бы преобразовать локальную переменную в поле. Таким образом, переменная доступна для каждого метода тестирования. Добавлена разбивка, чтобы контрольные примеры были независимы друг от друга. РЕДАКТИРОВАТЬ: перемещена инициализация board в setUp() Python Testing с pytest. Начало работы с pytest, Глава 1Вернуться Дальше Я обнаружил, что Python Testing с pytest является чрезвычайно полезным вводным руководством к среде тестирования pytest. Это уже приносит мне дивиденды в моей компании. Примеры в этой книге написаны с использованием Python 3.6 и pytest 3.2. pytest 3.2 поддерживает Python 2.6, 2.7 и Python 3.3+.
Под спойлером приведен список статей этой серии. ПоехалиВот как это выглядит при запуске: Если у вас есть цветной терминал, PASSED и нижняя строка зеленые. Прекрасно! Это неудачный тест: То, как pytest показывает сбои при тестирование, является одной из многих причин, почему разработчики любят pytest. Давайте посмотрим, что из этого выйдет: Отлично! Пробный тест test_failing получает свой раздел, чтобы показать нам, почему он не прошел. И pytest точно сообщает, что первый сбой: index 0 — это несоответствие. Значительная часть этого сообщения красного цвета, что делает его действительно выделяющимся (если у вас есть цветной терминал). Вот это да! В оставшейся части этой главы вы установите pytest, посмотрите на различные способы его запуска и выполните некоторые из наиболее часто используемых опций командной строки. В будущих главах вы узнаете, как написать тестовые функции, которые максимизируют мощность pytest, как вытащить код установки в разделы настройки и демонтажа, называемые фикстуры, и как использовать фикстуры и плагины, чтобы реально перегружать тестирование программного обеспечения. Еще одно полезное применение тестов программного обеспечения-это проверка ваших предположений о том, как работает тестируемое программное обеспечение, что может включать в себя тестирование вашего понимания сторонних модулей и пакетов и даже построение структур данных Python. Проект Tasks использует структуру Task, основанную на фабричном методе namedtuple, который является частью стандартной библиотеки. Структура задачи используется в качестве структуры данных для передачи информации между пользовательским интерфейсом и API. В остальной части этой главы я буду использовать Task для демонстрации запуска pytest и использования некоторых часто используемых параметров командной строки. Before we jump into the examples, let’s take a step back and talk about how to get pytest and install it. Прежде чем перейти к примерам, давайте сделаем шаг назад и поговорим о том, где взять pytest и как установить его. Добываем pytestШтаб-квартира pytest https://docs.pytest.org. Это официальная документация. Но распространяется он через PyPI (индекс пакета Python) в https://pypi.python.org/pypi/pytest. Как и другие пакеты Python, распространяемые через PyPI, используйте pip для установки pytest в виртуальную среду, используемую для тестирования: Если вы не знакомы с virtualenv или pip, я вас познакомлю. Ознакомьтесь с Приложением 1 «Виртуальные среды» на стр. 155 и в Приложении 2, на странице 159. Как насчет Windows, Python 2 и venv? Пример для virtualenv и pip должен работать на многих POSIX системах, таких как Linux и macOS, а также на многих версиях Python, включая Python 2.7.9 и более поздних. Источник venv/bin/activate в строке не будет работать для Windows, используйте вместо этого venv\Scripts\activate.bat. Для Python 3.6 и выше, вы можете обойтись venv вместо virtualenv, и вы не должны беспокоиться о том что бы установить его в первую очередь. Он включен в Python 3.6 и выше. Тем не менее, я слышал, что некоторые платформы по-прежнему ведут себя лучше с virtualenv. Запускаем pytestБез аргументов pytest исследует ваш текущий каталог и все подкаталоги для тестовых файлов и запустит тестовый код, который найдёт. Если вы передадите pytest имя файла, имя каталога или список из них, то будут найдены там вместо текущего каталога. Каждый каталог, указанный в командной строке, рекурсивно исследуется для поиска тестового кода. Для примера, давайте создадим подкаталог, называемый задачами, и начнем с этого тестового файла: The test_member_access() test is to demonstrate how to access members by name nd not by index, which is one of the main reasons to use namedtuples. Let’s put a couple more tests into a second file to demonstrate the _asdict() and _replace() functionality Вы можете использовать __new __.__ defaults__ для создания объектов Task без указания всех полей. Тест test_defaults() предназначен для демонстрации и проверки того, как работают умолчания. Тест test_member_access() должен продемонстрировать, как обращаться к членам по имени nd не по индексу, что является одной из основных причин использования namedtuples. Для запуска pytest у вас есть возможность указать файлы и каталоги. Если вы не укажете какие-либо файлы или каталоги, pytest будет искать тесты в текущем рабочем каталоге и подкаталогах. Он ищет файлы, начинающиеся с test_ или заканчивающиеся на _test. Eсли вы запустите pytest из каталога ch1, без команд, вы проведете тесты для четырёх файлов: Чтобы выполнить только наши новые тесты задач, вы можете предоставить pytest все имена файлов, которые вы хотите запустить, или каталог, или вызвать pytest из каталога, где находятся наши тесты: Часть выполнения pytest, где pytest проходит и находит, какие тесты запускать, называется test discovery (тестовым обнаружением). pytest смог найти все те тесты, которые мы хотели запустить, потому что мы назвали их в соответствии с соглашениями об именах pytest. Ниже приведен краткий обзор соглашений об именах, чтобы ваш тестовый код можно было обнаружить с помощью pytest: Давайте более подробно рассмотрим результат запуска только одного файла: Результат говорит нам совсем немного. pytest предоставляет изящный разделитель для начала тестового сеанса. Сеанс-это один вызов pytest, включая все тесты, выполняемые в нескольких каталогах. Это определение сеанса становится важным, когда я говорю о области сеанса по отношению к фикстурам pytest в определении области фикстур, на странице 56. Платформа darwin — у меня на Mac. На компьютере с ОС Windows платформа отличается. Далее перечислены версии Python и pytest, а также зависимости от пакетов pytest. И py, и pluggy — это пакеты, разработанные командой pytest, чтобы помочь с реализацией pytest.
Это две тестовые функции в файле. Эта строка относится к числу пройденных тестов и времени, затраченному на весь сеанс тестирования. При наличии непроходных тестов здесь также будет указан номер каждой категории. Результат теста-это основной способ, благодаря которому пользователь, выполняющий тест или просматривающий результаты, может понять, что произошло в ходе выполнения теста. В pytest тестовые функции могут иметь несколько различных результатов, а не просто пройти или не пройти. Вот возможные результаты тестовой функции: Выполнение Только Одного ТестаПожалуй, первое, что вы захотите сделать, после того, как начали писать тесты, — это запустить только один. Укажите файл напрямую и добавьте имя ::test_name : Теперь давайте рассмотрим некоторые варианты. Использование ОпцийНиже приведены несколько вариантов, которые весьма полезны при работе с pytest. Это далеко не полный список, но этих опций для начала вполне достаточно. —collect-only-k EXPRESSIONАга! Это были правильные тесты. -m MARKEXPR—maxfail=numУ нас пока нет никаких операторов печати в наших тестах; демонстрация была бы бессмысленной. Тем не менее, я предлагаю вам немного поиграть с ними, чтобы вы увидели это в действии. На цветном терминале в отчете вы также увидите красный результат FAILED и зеленые PASSED. До сих пор у нас не было неудачных тестов с локальными переменными. Если я возьму тест test_replace() и изменю —tb=style
—tb=line во многих случаях достаточно, чтобы показать, что не так. Если у вас гора неудачных тестов, этот параметр может помочь отобразить шаблон в сбоях: Это определенно достаточно, чтобы рассказать вам, что происходит. Есть три оставшихся варианта трассировки, которые мы пока не рассмотрели. —durations=NПоскольку наши тесты не достаточно длинные, я добавлю time.sleep(0.1) к одному из тестов. Угадайте, какой: Медленный тест с дополнительным sleep появляется сразу же после вызова метки, за которым следует установка и опровержение. Каждый тест по существу состоит из трех этапов: call(вызов), настройки(setup) и опровержения(teardown). Установка и опровержение также являются фикстурой, и вы можете добавить код для получения данных или тестируемой системы программного обеспечения в состояние предварительного условия до запуска теста, а также, при необходимости, очистить их. Я подробно освещаю фикстуры в главе 3, pytest Fixtures, на стр. 49. —versionПоскольку мы установили pytest в виртуальную среду, pytest будет находиться в каталоге site-packages этой виртуальной среды. Последний часть информации текста справки отображает это примечание: Это примечание важно, поскольку параметры, маркеры и фикстуры могут изменяться в зависимости от каталога или тестового файла. Это происходит потому, что по пути к указанному файлу или каталогу pytest может найти файлы conftest.py, которые могут включать функции-ловушки (hook functions), создающие новые параметры, определения фикстур и определения маркеров. Возможность настраивать поведение pytest в файлах conftest.py и тестовых файлах позволяет настраивать поведение локально для проекта или даже подмножество тестов для проекта. Вы узнаете о файлах conftest.py и ini, таких как pytest.ini в главе 6 «Конфигурация», на странице 113. УпражненияПрактикуйте активацию и деактивацию виртуальной среды несколько раз. Установите pytest в новой виртуальной среде. См. Приложение 2, pip, на странице 159, если у вас возникли проблемы. Даже если вы думали, что у вас уже установлен pytest, вам нужно установить его в виртуальную среду, которую вы только что создали. Создайте несколько тестовых файлов. Вы можете использовать те, которые мы использовали в этой главе или сделать свои собственные. Попрактикуйте pytest на этих файлах. Измените операторы assert. Не просто используйте assert something == something_else; попробуйте такие вещи, как:
|