Что такое светильники в программировании?
Я слышал этот термин много раз раньше (когда говорил о программировании), но не мог найти никакого объяснения, что это значит. Есть хорошие статьи или объяснения? Я не нашел ничего заслуживающего упоминания.
4 ответа
Я думаю, что вы имеете в виду тестовые приборы:
Цель тестового устройства - обеспечить наличие хорошо известной и фиксированной среды, в которой выполняются тесты, чтобы результаты можно было повторять. Некоторые люди называют это тестовым контекстом.
Примеры светильников:
- Loading a database with a specific, known set of data - Erasing a hard disk and installing a known clean operating system installation - Copying a specific known set of files - Preparation of input data and set-up/creation of fake or mock objects
(источник: википедия, см. ссылку выше)
Вот также некоторые практические примеры из документации фреймворка "Google Test".
Термин "приспособление" зависит от контекста, языка программирования или фреймворка.
1. Известное состояние, в котором выполняется тест.
Одна из наиболее трудоемких частей написания тестов - это написание кода, который устанавливает мир в известное состояние и затем возвращает его в исходное состояние по завершении теста. Это известное состояние называется фиксацией теста. Документация по PHP-модулю
Приспособление для тестирования (также известное как контекст тестирования) - это набор предварительных условий или состояния, необходимых для запуска теста. Разработчик должен установить заведомо исправное состояние перед тестами и вернуться в исходное состояние после тестов. Википедия (xUnit)
2. Файл с образцами данных.
Приспособления - это модное слово для обозначения образцов данных. Приспособления позволяют вам заполнить вашу тестовую базу данных предопределенными данными перед запуском тестов. Приспособления не зависят от базы данных и написаны на YAML. На каждую модель приходится один файл. RubyOnRails.org
3. Процесс, устанавливающий необходимое состояние.Â
Приспособление для тестирования программного обеспечения настраивает систему для процесса тестирования, предоставляя ей весь необходимый код для ее инициализации, тем самым удовлетворяя любые возможные предварительные условия. Примером может быть загрузка базы данных с известными параметрами с сайта клиента перед запуском теста. Википедия
Я думаю, что PHP-модульные тесты очень хорошо объясняют это:
Одна из наиболее трудоемких частей написания тестов - это написание кода, чтобы установить мир в известном состоянии, а затем вернуть его в исходное состояние после завершения теста. Это известное состояние называется креплением теста.
Также в Yii документах описаны крепежные испытания в хорошем состоянии:
Автоматизированные тесты должны выполняться много раз. Чтобы убедиться, что процесс тестирования повторяется, мы хотели бы запустить тесты в каком-то известном состоянии, называемом крепежом. Например, чтобы протестировать функцию создания постов в приложении блога, каждый раз, когда мы запускаем тесты, таблицы, в которых хранятся соответствующие данные о постах (например, таблица постов, таблица комментариев), должны быть возвращены в какое-то фиксированное состояние.
Вот простой пример теста светильников
<?php
use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
{
protected $stack;
protected function setUp()
{
$this->stack = [];
}
protected function tearDown()
{
$this->stack = [];
}
public function testEmpty()
{
$this->assertTrue(empty($this->stack));
}
public function testPush()
{
array_push($this->stack, 'foo');
$this->assertEquals('foo', $this->stack[count($this->stack)-1]);
$this->assertFalse(empty($this->stack));
}
public function testPop()
{
array_push($this->stack, 'foo');
$this->assertEquals('foo', array_pop($this->stack));
$this->assertTrue(empty($this->stack));
}
}
?>
Этот модульный тест PHP имеет функции с именами setUp
а также tearDown
что перед запуском теста вы настраиваете свои данные и по окончании можете восстановить их в исходное состояние.
Именно к этой теме, у JUnit есть хорошо объясненный документ. Вот ссылка!
Связанная часть статьи:
Тесты нужно запускать на фоне известного набора объектов. Этот набор объектов называется тестовым прибором. Когда вы пишете тесты, вы часто обнаруживаете, что тратите больше времени на написание кода для настройки прибора, чем на самом деле при тестировании значений.
В некоторой степени вы можете упростить написание кода фикстуры, уделяя пристальное внимание написанным вами конструкторам. Однако гораздо большая экономия достигается за счет совместного использования кода приборов. Зачастую вы сможете использовать один и тот же прибор для нескольких разных тестов. Каждый случай отправит немного разные сообщения или параметры в прибор и проверит различные результаты.
Когда у вас есть общее приспособление, вот что вы делаете:
Добавьте поле для каждой части фикстуры. Аннотируйте метод с помощью @ org.junit.Before и инициализируйте переменные в этом методе. Аннотируйте метод с помощью @ org.junit.After, чтобы высвободить любые постоянные ресурсы, которые вы выделили в setUp Например, чтобы написать несколько тестовых примеров, которые хотят работать с различными комбинациями 12 швейцарских франков, 14 швейцарских франков и 28 долларов США, сначала создают прибор:
public class MoneyTest {
private Money f12CHF;
private Money f14CHF;
private Money f28USD;
@Before public void setUp() {
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
f28USD= new Money(28, "USD");
}
}
Я пишу этот ответ как краткую заметку для себя о том, что такое "приспособление".
одинаковые-множественные-данные-тесты
Приспособления для тестирования: использование одной и той же конфигурации данных для нескольких тестов Если вы обнаружите, что пишете два или более тестов, которые работают с одинаковыми данными, вы можете использовать приспособление для тестирования. Это позволяет повторно использовать одну и ту же конфигурацию объектов для нескольких разных тестов.
вы можете прочитать больше на googletest
фикстуры могут использоваться во время тестирования интеграции или во время разработки (скажем, разработка пользовательского интерфейса, где данные поступают из базы данных разработки
поддельные пользователи для базы данных или тестирования
myproject/ светильники /my_fake_user.json
[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Lennon"
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}
]
вы можете прочитать больше в django docs
В Xamarin.UITest это объясняется следующим образом:
Как правило, каждый Xamarin.UITest написан как метод, который называется тестом. Класс, который содержит тест, известен как тестовое устройство. Приспособление для тестирования содержит либо один тест, либо логическую группу тестов и отвечает за любую настройку для запуска теста и за любую очистку, которую необходимо выполнить после завершения теста. Каждый тест должен следовать шаблону Arrange-Act-Assert:
- Организовать - тест будет устанавливать условия и инициализировать вещи, чтобы можно было выполнить тест.
- Действовать - тест будет взаимодействовать с приложением, вводить текст, нажимать кнопки и так далее.
- Утверждение - тест проверяет результаты действий, выполненных на шаге Act, для определения правильности. Например, приложение может проверить, что отображается конкретное сообщение об ошибке.
Ссылка на оригинальную статью вышеупомянутой выдержки
А внутри кода Xamarin.UITest это выглядит следующим образом:
using System;
using System.IO;
using System.Linq;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Queries;
namespace xamarin_stembureau_poc_tests
{
[TestFixture(Platform.Android)]
[TestFixture(Platform.iOS)]
public class TestLaunchScreen
{
IApp app;
Platform platform;
public Tests(Platform platform)
{
this.platform = platform;
}
[SetUp]
public void BeforeEachTest()
{
app = AppInitializer.StartApp(platform);
}
[Test]
public void AppLaunches()
{
app.Screenshot("First screen.");
}
[Test]
public void LaunchScreenAnimationWorks()
{
app.Screenshot("Launch screen animation works.");
}
}
}
Надеюсь, что это может быть полезно для кого-то, кто ищет лучшего понимания о приборах в программировании.