it-swarm.com.de

Visual Studio 2015 oder 2017 erkennt keine Komponententests

EDIT 19.10.2016:

Die ursprüngliche Frage betraf ein spezielles Problem für VS2015 CTP6 mit dem XUnit-Testläufer. Aus den Antworten geht klar hervor, dass es bei der Erkennung von Komponententests in Visual Studio ein viel größeres Problem gibt, das in vielen verschiedenen Situationen auftreten kann. Ich habe meine Frage aufgeräumt, um das zu reflektieren.

Ich habe auch ein Skript in meine eigene Antwort aufgenommen, das ich bis heute benutze, um ähnliche Probleme zu lösen, wenn sie auftreten.

Viele andere Antworten haben sich ebenfalls als hilfreich erwiesen, um die Feinheiten des VS-Testläufers besser zu verstehen. Ich schätze, dass die Leute immer noch ihre Lösungen teilen!


Ursprüngliche Frage 10.04.2015:

Seit gestern erkennt mein Visual Studio-Testexplorer keine Tests für eines meiner Projekte. Die grüne Ladeleiste wird auch nach dem Bau nicht angezeigt.

Wenn ich zum Visual Studio-Testexplorer gehe und auf "Alle ausführen" klicke oder mit der rechten Maustaste auf eine Testmethode klicke und "Tests ausführen" auswähle, wird in meinem Ausgabefenster Folgendes angezeigt:

Could not load file or Assembly 'Microsoft.VisualStudio.Web.ProjectSystem, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

Ich führe Visual Studio 2015 CTP 6 unter Windows 10 Pro Technical Preview, Build 10041, aus. Die .NET Framework-Version scheint keine Rolle zu spielen - sie tritt bei 4.0, 4.5.2 und 4.6 auf.

Ich habe es mit den folgenden Test-Frameworks versucht und alle geben das gleiche Verhalten:

  • Microsoft.VisualStudio.QualityTools.UnitTestFramework v14.0.22609.0
  • xunit v2.1.0-beta1-build2945 mit xunit.runner.visualstudio v2.1.0-beta1-build1051
  • NUnit v2.6.4 mit NUnitTestAdapter v2.0.0

Ich habe auf GitHub (xunit) ein Problem gefunden, das ähnlich zu sein schien: Es können keine Tests entdeckt werden # 295 , mit diesem Kommentar vom xunit-Team:

Beachten Sie, dass Visual Studio 2015 CTP 5 von vielen Personen mit allgemeinen Unit-Tests (nicht nur xUnit.net) als fehlerhaft gemeldet wurde. Erwarten Sie also nicht, dass dies funktioniert.

Stellen Sie außerdem sicher, dass Sie den Runner-Cache von Visual Studio bereinigt haben. Wenn es beschädigt wird, verhält sich Visual Studio dauerhaft so lange schlecht, bis es gelöscht wird. Um den Cache zu leeren, fahren Sie alle Instanzen von Visual Studio herunter und löschen Sie dann den Ordner% TEMP%\VisualStudioTestExplorerExtensions (ehrlich gesagt, würde es wahrscheinlich nicht schaden, alles in% TEMP% zu löschen, was gelöscht werden kann).

Ich habe versucht, ihren Vorschlag, den Ordner %TEMP%\VisualStudioTestExplorerExtensions zu löschen. Leider konnte das Problem dadurch nicht behoben werden.

Ich habe festgestellt, dass ReSharper tatsächlich in der Lage ist, einige Tests zu erkennen. Es funktioniert nur für die VS- und NUnit-Tests, nicht für xunit.

Es muss eine Art temporären oder Cache-Ordner geben, den ich löschen muss, aber ich weiß, dass Visual Studio viele davon hat und nicht alle ohne unerwünschte Nebenwirkungen gelöscht werden können.

148
Fred Kleuver

EDIT 2016-10-19 (PowerShell-Skript)

Diese Ausgabe kehrt immer wieder zurück. Ich habe ein kleines PowerShell-Snippet geschrieben, um das Löschen der relevanten Cache-/Temp-Ordner/-Dateien für mich zu automatisieren. Ich teile es hier für zukünftige Leser:

@(
"$env:TEMP"
"$env:LOCALAPPDATA\Microsoft\UnitTest"
"$env:LOCALAPPDATA\Microsoft\VisualStudio\14.0\1033\SpecificFolderCache.xml"
"$env:LOCALAPPDATA\Microsoft\VisualStudio\14.0\1033\ProjectTemplateMRU.xml"
"$env:LOCALAPPDATA\Microsoft\VisualStudio\14.0\ComponentModelCache"
"$env:LOCALAPPDATA\Microsoft\VisualStudio\14.0\Designer\ShadowCache"
"$env:LOCALAPPDATA\Microsoft\VisualStudio\14.0\ImageLibrary\cache"
"$env:LOCALAPPDATA\Microsoft\VisualStudio Services\6.0\Cache"
"$env:LOCALAPPDATA\Microsoft\WebsiteCache"
"$env:LOCALAPPDATA\NuGet\Cache"
) |% { Remove-Item -Path $_ -Recurse -Force }

Stellen Sie sicher, dass Sie Visual Studio vorher schließen, und es ist wahrscheinlich eine gute Idee, anschließend einen Neustart durchzuführen.

Das Löschen des TEMP-Ordners ist möglicherweise nicht erforderlich und in manchen Fällen sogar unerwünscht. Daher würde ich empfehlen, den TEMP-Ordner zuerst zu löschen. Lassen Sie einfach den "$env:TEMP" weg.

Ursprüngliche Antwort 2015-04-12

Das Problem wurde nach einer gründlichen Reinigung von Visual Studio-bezogenen Temp/Cache-Ordnern "gelöst".

Da ich nicht die Zeit hatte, alles einzeln durchzugehen und dann zwischendurch zu testen, weiß ich leider nicht, wer das Problem tatsächlich verursacht hat.

Dies sind die genauen Schritte, die ich unternommen habe:

  1. Geschlossenes Visual Studio
  2. CCleaner zum Löschen von temp Dateien/Ordnern des Systems und des Browsers verwendet
  3. Manuell gelöschte/löschte die folgenden Dateien/Ordner:

    • %USERPROFILE%\AppData\Local\Assembly
    • %USERPROFILE%\AppData\Local\Microsoft\UnitTest
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\1033\SpecificFolderCache.xml
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\1033\ProjectTemplateMRU.xml
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\ComponentModelCache
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\Designer\ShadowCache
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio\14.0\ImageLibrary\cache
    • %USERPROFILE%\AppData\Local\Microsoft\VisualStudio Services\6.0\Cache
    • %USERPROFILE%\AppData\Local\Microsoft\WebsiteCache
    • %USERPROFILE%\AppData\Local\NuGet\Cache
    • %USERPROFILE%\AppData\Local\Temp
29
Fred Kleuver

Zu meiner Überraschung löste das Löschen von temporären Dateien im Verzeichnis %TEMP% das Problem für mich.

Hinweis: Dieser Pfad befindet sich im Allgemeinen unter C:\Users\(yourusername)\AppData\Local\Temp.

Wenn @ Warren-P enthalten ist, können Sie zum temporären Ordner navigieren, indem Sie %temp% im Startmenü eingeben oder "Datei-Explorer" starten und %temp% in die Adressleiste eingeben.

143
RobM

Es kann sein, dass Ihre Codes mit x64 kompiliert werden. Daher muss die Architektur des Standardprozessors als X64 aktiviert werden.

Test > Test Settings > Default Processor Architecture > X64
83
Dac Toan Ho
  • Prüfen Sie, ob NUnit Test Adapter 2/3 in VisualStudio installiert ist.
    (Tools>Extensions and Updates )

  • Stellen Sie sicher, dass die richtige Prozessorarchitektur ausgewählt ist:
    (Test>Test Settings>Default Processor Architecture)

63
MichiBack

Ein Grund für dieses Problem ist, dass Ihre Testklasse nicht öffentlich ist. MSTest entdeckt nur Tests aus öffentlichen Klassen.

18
AfshinS

Wenn Sie in Visual Studio 2015 (Update 3) die Tests im Test-Explorer anhängen möchten, müssen Sie den NUnit Test Adapter installieren. Laden Sie den Adapter unter Tools-> Extension And Updates-> Online (Registerkarte Nach dem Adapter suchen) -> Download ..__ Wenn Sie das Visual Studio neu starten, sehen Sie die Änderung für das Testframework.

13
Pankti Shah

Ich habe keine vollständige Antwort darauf, aber ich habe einige Dinge bestimmt, indem ich mit einem Testprojekt gespielt habe:

  1. Der xunit.runner.aspnet : 2.0.0-aspnet-beta4, der scheinbar Teil der offiziellen Beta4-Version von Aspnet5 ist, funktioniert in Visual Studio nicht.
  2. Verwenden Sie stattdessen die Pakete "xunit": "2.1.0-*" und "xunit-runner.dnx": "2.1.0-*" in Visual Studio.
  3. Damit VS die Tests erkennen kann, MUSS Ihr Projekt einen SINGLE-Befehl mit dem Namen "test" haben, der "xunit.runner.dnx" ausführt. Das Hinzufügen zusätzlicher Befehle kann dazu führen, dass es nicht funktioniert.
  4. Wenn das Fenster des Test-Explorers immer noch leer ist, ENTFERNEN Sie den Befehl "test" aus Ihrem Projekt, erstellen Sie die Projektmappe erneut, und fügen Sie den Befehl "test" wieder in project.json ein.
  5. Das Löschen aller Ihrer Caches gemäß dem Vorschlag von @ Fred-Kleuver mag hilfreich sein, aber ich habe nicht alle Schritte isoliert gemacht, daher bin ich nicht sicher.

Dies ist gemäß VS 2015 CTP 6 aktuell und verwendet die Beta4-Versionen, nicht die Tageszeitungen.

9
Avi Cherry

Ich hatte einen Fall, in dem einige Tests nicht abgeholt wurden, weil ich sie gemacht hatte async wie folgt:

public async void This_IsMy_UnitTest()

Das Problem war, dass ich vergessen hatte, sie zu veranlassen, ein Task und nicht void zurückzugeben, als ich die Umschaltung durchführte. Man würde denken, dies würde einen Fehler verursachen oder den Test nicht bestehen, aber nein. Die Unit-Tests in dieser Klasse wurden vollständig ignoriert und verhielten sich so, als ob sie nicht existierten.

Nach ungefähr 3 Bereinigungs- und Build-Vorgängen und einem Neustart von VS.NET Sah ich den Testlauf und konnte nicht angeben, dass ich vergessen hatte, den Rückgabetyp Task hinzuzufügen:

public async Task This_IsMy_UnitTest()

Nach dem Update wurden die Unit-Tests gefunden und funktionierten korrekt. Dies mag ein Edge-Fall sein, aber wenn async Tests für die Verwendung von await enthalten sind, die Signatur jedoch nicht korrekt ist, kann dies dasselbe Problem verursachen, und es ist nicht das erste Mal, dass ich dies getan habe.

9
atconway

Gehen Sie zum Nuget-Paketmanager und laden Sie Nunit Adapter wie folgt herunter. 

 enter image description here

8
Debendra Dash

In meinem Fall war die Lösung die Installation der Erweiterung NUnit 3 Test Adapter in meinem Visual Studio 2015.

 'Extensions and Updates' is present under 'Tools' meue

5
Umar T.

Einfach restart Visual Studio und im Test Explorer "Run All" ausführen ... Alle meine Tests werden dann erkannt.

5
lukyer

Ich hatte das gleiche Pronlem, aber der Ordner "% TEMP%\VisualStudioTestExplorerExtensions" existierte nicht auf meinem Rechner. Als ich die Beiträge las, hatte ich die Idee, es zu erstellen, und es funktioniert. Der Test-Explorer kann jetzt alle meine Tests anzeigen. Vielen Dank.

5
Vinci

In meinem Fall (Visual Studio Enterprise 14.0.25425.01 Update 3, Resharper 2016.2) musste ich nur eine saubere Lösung über das Build-Menü erstellen. Wenn Sie die Lösung neu erstellen, wird der Test-Explorer "aufgeweckt" und alle Tests werden erneut angezeigt.

4
sammy34

Dies wird den meisten Menschen wahrscheinlich nicht helfen, aber jemand, der bei Unit-Tests noch unerfahren war, hatte eine Testmethode geschrieben, die bool anstelle von void zurückgab:

[TestMethod]
public bool TestSomething()

Das Ändern des Rückgabetyps in void hat das Problem behoben.

3
Sam

In meinem Fall ignorierte MSTest unter VS 2015 Tests mit Testnamen (d. H. Methodennamen), die länger als 174 Zeichen waren. Durch die Verkürzung des Namens konnte der Test sichtbar werden. Dies wurde durch Schätzen und Prüfen durch Manipulieren des Testnamens ermittelt.

3
Kenneth K.

In meinem Fall war das Problem "zwischen dem Stuhl und der Tastatur". Ich war im Configuration Manager zu einer Konfiguration gewechselt, die meine Komponententestprojekte beim Build nicht enthielt. Wenn Sie zu einer Konfiguration (z. B. Debug) wechseln, die alle Projekte enthält, wurde das Problem behoben.

3
AndyZez

Stellen Sie sicher, dass Siexunit.runner.visualstudiopackage in Ihrem Testprojekt packages.config haben und dass auch dieses ordnungsgemäß wiederhergestellt wurde.

Ich weiß, dass dies nicht der Fall war, aber für jemanden wie mich könnte es Zeit sparen.

3
pvasek

Ich möchte nur hinzufügen, dass ich eine völlig andere Lösung als die obigen gefunden habe.

Ich hatte meine Testklasse wie folgt erklärt:

[TestClass]
class ClassificationTests
{
   //unit tests
}

Sobald ich der Klasse den Modifizierer public hinzugefügt habe, funktionierte es wie erwartet!

3
Persistence

Wenn Sie mit .NET Standard oder .NET Core arbeiten, müssen Sie das NuGet-Paket für NUnit Test Adapter und nicht die Erweiterung verwenden.

Es wird empfohlen, den Adapter über NuGet zu installieren, wenn Sie .NET Core- oder .NET Standard-Projekte testen. Der VSIX-Adapter unterstützt und unterstützt .NET Core nicht, da VSIX-Pakete nicht mehrere Plattformen ansprechen können.

Quelle: NUnit GitHub Wiki

.

Überprüfen Sie auch die FAQ dort:

Meine Tests werden in Visual Studio 2017 nicht angezeigt.

  • Verwenden Sie das NuGet-Paket?
  • Verwenden Sie Version 3.8.0 oder eine neuere Version des NuGet-Pakets?
  • Ist Ihr Test auf .NET Core oder das gesamte .NET Framework ausgerichtet? (siehe oben)
  • Haben Sie eine Paketreferenz zu Microsoft.NET.Test.Sdk hinzugefügt?
  • Haben Sie Visual Studio neu gestartet? Es ist immer noch ein bisschen temperamentvoll.

Quelle: NUnit GitHub Wiki

2
m93a

Irgendwie wurde mein Projekt als Static Library (.lib) kompiliert. Nach dem Ändern in eine Dynamic Library (.dll) wurden die Tests von Visual Studio 2012 ordnungsgemäß erkannt.

My Unit Test Project ->
Properties ->
Configuration Properties ->
General ->
Configuration Type
1
Maate

Ich wurde auch von diesem wunderbaren kleinen Feature gebissen und nichts, was hier beschrieben wurde, funktionierte für mich. Erst als ich die Build-Ausgabe noch einmal durchgesehen und festgestellt habe, dass die relevanten Projekte nicht gebaut wurden. Ein Besuch beim Konfigurationsmanager bestätigte meinen Verdacht. 

Glücklicherweise erlaubte mir Visual Studio 2015 das Hinzufügen neuer Projekte, entschied jedoch, dass es sich nicht lohnt, sie zu erstellen. Nachdem ich die Projekte zum Build hinzugefügt hatte, begann es gut zu spielen.

1
Robbie Dee

Das Löschen der Datei\AppData\Local\Microsoft\VisualStudio\14.0\1033\SpecificFold‌ erCache.xml hat das Problem für mich gelöst.

1
der_chirurg

Es war für mich so einfach, das Problem zu beheben:

  • Wählen Sie Ihr Unit-Test-Projekt aus
  • Klicken Sie im Projektmappen-Explorer auf die Schaltfläche "Alle Dateien anzeigen". Neue temporäre Dateien wurden im Dateibaum des Projektmappen-Explorers unter "obj\x86\Debug" angezeigt. 
  • Löschen Sie diese temporären Dateien und erstellen Sie das Projekt neu.
  • Wiederholte Tests und funktionierte!.
1
mggSoft

Ich löste es, indem ich X64 in Folgendes änderte: Klicken Sie mit der rechten Maustaste auf Projekt -> Eigenschaften -> Erstellen -> Plattformziel -> Beliebige CPU

1

Komm rein, um meine Lösung zu teilen. Ich war unter Windows 10, Visual Studio 2015, NUnit 3.5, NUnit Test Adapter 3.6 (über NuGet, nicht über die VISX-Erweiterung) und keiner meiner Tests wurde entdeckt. Mein Problem war, dass im Testprojekt meiner Lösung irgendwie eine Verknüpfung zu meinem Ordner "Documents" im Projektordner erstellt wurde. Ich vermute, der Testadapter sah die Abkürzung und wurde aufgehängt, als er versuchte herauszufinden, was er damit tun sollte, was dazu führte, dass die Unit-Tests nicht angezeigt wurden.

1
Thomas Parikka

Dies ist mir passiert, weil mein Testprojekt einen app.config..__ enthielt. Es wurde automatisch von NuGet-Paketen für die Umleitung von Assemblys hinzugefügt, aber meine Tests liefen offensichtlich gut ohne. 

Siehe: https://developercommunity.visualstudio.com/comments/42858/view.html .

1
Ohad Schneider

Wir hatten das gleiche Problem. Wir haben eine große VS 2015-Lösung mit mehreren C # -Projekten und noch mehr Testprojekten. 

Der Test von Resharper hat gut funktioniert, aber VS Test Explorer schlug fehl.

Es stellte sich heraus, dass die Projekte nicht die gleiche Version von MsTest TestFramework und TestAdapter hatten, und dass sie manchmal NuGets und andere gute alte Referenzen verwendeten und dass dies offensichtlich nicht unterstützt wird (so viel für eine so teure IDE).

Durch Entfernen aller Microsoft.VisualStudio.Test * -Referenzen und durch Hinzufügen/Aktualisieren der beiden MSTest NuGets wurde das Problem behoben.

1
TommyD

Ich löste dieses Problem, indem ich feststellte, dass das Target Framework für mein Testprojekt anders war als das zu testende Projekt. Ja, ich habe dieses Problem verursacht, indem ich das Zielframework von der Standardeinstellung (Projekt> Eigenschaften> Anwendung) geändert habe. Dies ist jedoch für das Testprojekt fehlgeschlagen, das mehrere Wochen später erstellt wurde. Die Nichtübereinstimmung verursachte keinen Compiler-Fehler, aber es wurde eine Warnung im Fenster Error List angezeigt. Nachdem ich die Option zum Anzeigen von Warnungen ausgewählt hatte, war die Lösung offensichtlich.

0
JerryM

Nachdem ich 2 Tage verbracht hatte ... funktionierte nichts von mir. Die einzige "Lösung" war: Gehen Sie zu Projekteigenschaften -> Registerkarte Erstellen. Klicken Sie dann in der rechten unteren Ecke des Bereichs auf die Schaltfläche Erweitert. Ändern Sie "Debug Info:" in "full" und klicken Sie auf OK.

Hier sind die Screenshots:  enter image description here

 enter image description here  enter image description here

0
curiousBoy

Deaktivieren Sie den Windows Defender-Dienst. Durch das sofortige Deaktivieren dieser Option wurden alle Gerätetests im Test Explorer angezeigt.

0
Brad Johnson

Stellen Sie sicher, dass Ihre Klasse mit dem [TestClass]-Attribut public und nicht private ist.

0
alex

Ich hatte das gleiche Problem. Die Einheitstestvorlage von Visual Studio 2015 (Update 3) generiert eine Klasse mit der wie folgt definierten TestContext-Eigenschaft:

    private TestContext testContextInstance;

    /// <summary>
    ///Gets or sets the test context which provides
    ///information about and functionality for the current test run.
    ///</summary>
    public TestContext TestContext
    {
        get
        {
            return testContextInstance;
        }
        set
        {
            testContextInstance = value;
        }
    }

Nach dem Umbenennen in ein öffentliches Feld (unglysig) konnte der Testläufer den Test entdecken. 

public TestContext TestContext;

Sehr seltsames Verhalten, aber es war in meinem Fall die Ursache des Problems.

0

Ich hatte das gleiche Problem. Ich habe das Projekt gerade gereinigt und neu aufgebaut und konnte die fehlenden Tests sehen.

0
Eric

Im Bereich VS-Ausgabe (in die Testansicht gewechselt) ist dieser Fehler aufgetreten:

Datei oder Assembly 'XXX.UnitTest, Version = 9.4.0.0, Kultur = neutral, PublicKeyToken = 14345dd3754e3918' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Starke Namensüberprüfung fehlgeschlagen. (Ausnahme von HRESULT: 0x8013141A)

In den Projekteinstellungen für das Testprojekt auf der Registerkarte "Signieren" hatte jemand die Option "Assembly signieren" markiert. Wenn Sie dies nicht überprüfen und das Gebäude dazu führte, wurden die Tests angezeigt.

Ein Kollege löste dasselbe Problem, indem er der Registrierung Schlüssel aus diesem Beitrag hinzufügte:

https://blogs.msdn.Microsoft.com/keithmg/2012/03/20/strong-name-validation-ailed-exception-from-hresult-0x8013141a/

0
Scott Langham

Ich möchte noch einen weiteren Grund hinzufügen, warum Tests möglicherweise nicht gefunden wurden. In meinem Fall handelte es sich um C++ - Komponententests, die nicht gefunden wurden.

In meinem Fall wurden Tests für ein bestimmtes Projekt nicht gefunden, da das Ausgabeverzeichnis nicht im Projektverzeichnis enthalten war. Wenn Sie dies ändern, wurde sichergestellt, dass die Tests gefunden wurden.

0
Marcus

Dieses Thema ist etwas veraltet, aber meine Lösung für den fehlenden Teststatus in VS2015:

Der Taskstatus wird nur in der Debug-Build-Konfiguration angezeigt. Dies macht es natürlich auch unmöglich, den Test über den Test-Explorer zu debuggen.

0
pehur

Das einzige, was für mich funktioniert hat: Entfernen Sie C:\Users (IhrBenutzername)\AppData\Local\Temp

Andere Vorschläge sind in der Regel gültig. Wenn VS jedoch Ihre Änderungen nicht aufgreift und in Ihrer Ausgabe weiter bellt, können Sie keine Tests entdecken Seien Sie einfach "irgendwann" beim Start und keine Ihrer Lösungen wird mehr funktionieren, wobei "gestern" alles gut funktioniert hat.

0
Roland Roos

Ich hatte Probleme mit dem gleichen Problem für das VSTest-Framework und meine nativen Unit-Tests.

Nachdem ich all die zuvor genannten Dinge ausgeführt hatte, entfernte ich alle Vorkommen des Symbols "#" im Verzeichnispfad meiner Lösung. Es funktioniert tatsächlich.

Ich lasse es hier für Googler, die diese Frage in Zukunft finden werden.

0

Stellen Sie sicher, dass Ihre Testmethoden keine Parameter haben. Dies ist eine andere Art, wie Ihr Test nicht angezeigt wird.

Keine Fehler oder Warnungen.

0
Khan

Ich habe den Fehler gemacht, asynchrone Methoden zu erstellen, aber nichtig zurückzukehren.

Geändert: public async void Test()

An: public async Task Test()

0
Vishal

Wenn Sie mit mehreren App- oder Web.Config-Dateien arbeiten. z.B:

 enter image description here

Es ist wahrscheinlich, dass Sie eine Konfiguration verwenden, die FREIGABE-MODUS ist und die Einstellung des Debug-Modus aus der Konfiguration entfernt:

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />

Ändern Sie die Konfiguration in eine, die den DEBUG-MODUS nicht entfernt.

0
Jeremy Thompson