diff --git a/client/src/app/admin/instance/dataset/components/attribute/output/index.spec.ts b/client/src/app/admin/instance/dataset/components/attribute/output/index.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bd09ef621faecb323879401828d89594f8ec1a1c
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/attribute/output/index.spec.ts
@@ -0,0 +1,17 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { outputComponents } from './index';
+
+describe('[admin][instance][dataset][components][attribute][output] index', () => {
+    it('Test output index components', () => {
+        expect(outputComponents.length).toEqual(2);
+    });
+});
+
diff --git a/client/src/app/admin/instance/dataset/components/attribute/output/table-output.component.spec.ts b/client/src/app/admin/instance/dataset/components/attribute/output/table-output.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f4f343a47953c2fd3236fd54d027bb5b89acae8d
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/attribute/output/table-output.component.spec.ts
@@ -0,0 +1,36 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { TableOutputComponent } from './table-output.component';
+
+describe('[admin][instance][dataset][components][attribute][output] TableOutputComponent', () => {
+    let component: TableOutputComponent;
+    let fixture: ComponentFixture<TableOutputComponent>;
+
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                TableOutputComponent,
+            ],
+            imports: [
+                BrowserAnimationsModule,
+            ],
+        });
+        fixture = TestBed.createComponent(TableOutputComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create the component', () => {
+        expect(component).toBeTruthy();
+    });
+});
+
diff --git a/client/src/app/admin/instance/dataset/components/attribute/output/tr-output.component.spec.ts b/client/src/app/admin/instance/dataset/components/attribute/output/tr-output.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..65cf844aad023023fc02f4d07746579e512a5b7d
--- /dev/null
+++ b/client/src/app/admin/instance/dataset/components/attribute/output/tr-output.component.spec.ts
@@ -0,0 +1,64 @@
+/**
+ * This file is part of Anis Client.
+ *
+ * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
+ import { ReactiveFormsModule } from '@angular/forms';
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+ import { Attribute, OutputFamily } from 'src/app/metamodel/models';
+import { TrOutputComponent } from './tr-output.component';
+ 
+ describe('[admin][instance][dataset][components][attribute][] TrOutputComponent', () => {
+     let component: TrOutputComponent;
+     let fixture: ComponentFixture<TrOutputComponent>;
+ 
+     beforeEach(() => {
+         TestBed.configureTestingModule({
+             declarations: [
+                TrOutputComponent,
+             ],
+             imports: [
+                 BrowserAnimationsModule,
+                 ReactiveFormsModule
+             ],
+         });
+         fixture = TestBed.createComponent(TrOutputComponent);
+         component = fixture.componentInstance;
+         let attribute: Attribute;
+         component.attribute = { ...attribute, name: 'test', output_display: 0, id_output_category: 0 , selected: true};
+         fixture.detectChanges();
+     });
+ 
+     it('should create the component', () => {
+         expect(component).toBeTruthy();
+     });
+     it('outputCategoryOnChange() should set form.id_output_category to null', () => {
+         component.form.controls.id_output_category.setValue('');
+         expect(component.form.controls.id_output_category.value).toEqual('');
+         component.outputCategoryOnChange();
+         expect(component.form.controls.id_output_category.value).toEqual(null);
+     });
+     it('getOutputFamilyLabel(idOutputFamilly: number) should return test2', () => {
+         let outputFamilyList: OutputFamily[] = [
+             { display: 0, id: 1, label: 'test0', opened: false },
+             { display: 0, id: 2, label: 'test1', opened: false },
+             { display: 0, id: 3, label: 'test2', opened: false }
+         ]
+         component.outputFamilyList = outputFamilyList;
+         let result: string = component.getOutputFamilyLabel(3);
+         expect(result).toEqual('test2');
+     })
+     it('submit() should emit with attribute and form.value', () => {
+         let spy = jest.spyOn(component.save, 'emit');
+         component.submit();
+         expect(spy).toHaveBeenCalledTimes(1);
+         expect(spy).toHaveBeenCalledWith({ ...component.attribute, ...component.form.value });
+     })
+ });
+ 
+ 
\ No newline at end of file