diff --git a/tests/Filtre/ExtraireBalisesTest.php b/tests/Filtre/ExtraireBalisesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0687325dc2462677a93879e13af0788ebc9be717
--- /dev/null
+++ b/tests/Filtre/ExtraireBalisesTest.php
@@ -0,0 +1,87 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Test unitaire de la fonction extraire_multi du fichier ./inc/filtres.php
+ */
+
+namespace Spip\Core\Tests\Filtre;
+
+use PHPUnit\Framework\TestCase;
+
+class ExtraireBalisesTest extends TestCase
+{
+	public static function setUpBeforeClass(): void
+	{
+		find_in_path('./inc/filtres.php', '', true);
+		find_in_path('./inc/lang.php', '', true);
+	}
+
+	public function testFiltresExtraireBalisesMediaRss(): void
+	{
+
+		$rss = file_get_contents(dirname(__DIR__) . '/Fixtures/data/dailymotion.rss');
+		if (empty($rss)) {
+			$this->markTestSkipped();
+		}
+
+		$balises_media = extraire_balises($rss, 'media:content');
+		$this->assertIsArray($balises_media);
+		$this->assertEquals(count($balises_media), 40);
+	}
+
+
+	/**
+	 * @dataProvider providerFiltresExtraireBalises
+	 */
+	public function testFiltresExtraireBalises($expected, ...$args): void
+	{
+		$actual = extraire_balises(...$args);
+		$this->assertSame($expected, $actual);
+		$this->assertEquals($expected, $actual);
+	}
+
+	public function providerFiltresExtraireBalises(): array
+	{
+
+		return [
+			[
+				['<a href="truc">chose</a>'],
+				'allo <a href="truc">chose</a>'
+			],
+			[
+				['<a href="truc" />'],
+				'allo <a href="truc" />'
+			],
+			[
+				["<a\nhref='truc' />"],
+				'allo' . "\n" . " <a\nhref='truc' />"
+			],
+			[
+				[['<a href="1">'], ['<a href="2">']],
+				['allo <a href="1">', 'allo <a href="2">']
+			],
+			[
+				['<a href="truc">chose</a>'],
+				'bonjour <a href="truc">chose</a> machin'
+			],
+			[
+				['<a href="truc">chose</a>', '<A href="truc">machin</a>'],
+				'bonjour <a href="truc">chose</a> machin <A href="truc">machin</a>',
+			],
+			[
+				['<a href="truc">'],
+				'bonjour <a href="truc">chose'
+			],
+			[
+				['<a href="truc"/>'],
+				'<a href="truc"/>chose</a>'
+			],
+			[
+				['<a>chose</a>'],
+				'<a>chose</a>'
+			]
+		];
+	}
+}
diff --git a/tests/legacy/unit/filtres/data/dailymotion.rss b/tests/Fixtures/data/dailymotion.rss
similarity index 100%
rename from tests/legacy/unit/filtres/data/dailymotion.rss
rename to tests/Fixtures/data/dailymotion.rss
diff --git a/tests/legacy/unit/filtres/extraire_balise.php b/tests/legacy/unit/filtres/extraire_balise.php
deleted file mode 100644
index aceacbead32c426e4bdd90aa4ce4bbfbc191cc56..0000000000000000000000000000000000000000
--- a/tests/legacy/unit/filtres/extraire_balise.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-$test = 'extraire_balise';
-
-$remonte = __DIR__ . '/';
-
-while (! is_file($remonte . 'test.inc')) {
-	$remonte .= '../';
-}
-
-require $remonte . 'test.inc';
-
-include_spip('inc/filtres');
-
-// extraire une balise ouvrante
-
-$essais[] = ['<a href="truc">chose</a>', 'allo <a href="truc">chose</a>'];
-
-// extraire une balise autofermante
-
-$essais[] = ['<a href="truc" />', 'allo <a href="truc" />'];
-
-// peu importent les \n
-
-$essais[] = ["<a\nhref='truc' />", 'allo' . "\n" . " <a\nhref='truc' />"];
-
-// extraire plusieurs balises (array => array)
-
-$essais[] = [['<a href="1">', '<a href="2">'], ['allo <a href="1">', 'allo <a href="2">']];
-
-$err = tester_fun('extraire_balise', $essais);
-
-// si le tableau $err est pas vide ca va pas
-
-if ($err) {
-	die('<dl>' . implode('', $err) . '</dl>');
-}
-
-$essais = [];
-
-// un tag
-
-$essais[] = [['<a href="truc">chose</a>'], 'bonjour <a href="truc">chose</a> machin'];
-
-// deux tags
-
-$essais[] = [
-	['<a href="truc">chose</a>', '<A href="truc">machin</a>'],
-	'bonjour <a href="truc">chose</a> machin <A href="truc">machin</a>',
-];
-
-// tag mal forme
-
-$essais[] = [['<a href="truc">'], 'bonjour <a href="truc">chose'];
-
-// piege
-
-$essais[] = [['<a href="truc"/>'], '<a href="truc"/>chose</a>'];
-
-// sans attributs
-
-$essais[] = [['<a>chose</a>'], '<a>chose</a>'];
-
-$err = tester_fun('extraire_balises', $essais);
-
-// si le tableau $err est pas vide ca va pas
-
-if ($err) {
-	die('<dl>' . implode('', $err) . '</dl>');
-}
-
-// un exemple d'utilisation sympa du mode "array" de ces fonctions:
-
-// aller chercher toutes les images d'un texte (img/src) ou encore
-
-// tous les url des balises media:content :
-
-lire_fichier($f = __DIR__ . '/data/dailymotion.rss', $rss);
-
-$flux = extraire_attribut(extraire_balises($rss, 'media:content'), 'url');
-
-# var_dump($flux);
-
-if (! is_array($flux) || ($flux === []) === 39) {
-	echo "pas vu les 39 media:content de dailymotion.rss ! (dans {$f})\n";
-}
-
-// en objet on ecrirait
-
-// $rss->extraire_balises('media:content')->extraire_attribut('url');
-
-echo 'OK';