Autor Beitrag
rakize
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 25.11.14 14:11 
Hallo an alle,

Hoffe ich werde hier weitergeholfen, bin schon bissel verzweifelt :)

Also folgende Aufgabe:
Ich will einen Automatischen Test, dazu habe ich ein C# Projekt, dass ich vor dem Test ausführen muss, dieser hinterlegt einen Wert, dieser soll dann mit UnitTest bzw CodedUI Test zum Test mit Assert verglichen werden

Also eine DLL auszuführen, dass das mein Projekt startet und mit Assert erfolgreich oder nicht erfolgreich anzeigt.

Urgendwie hab ich das Problem das Projekt vorher starten zu lassen und sofort danach den Test ausführen zu lassen.

Danke um jegliche Hilfe.


Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Di 25.11.2014 um 17:30
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.11.14 14:15 
Zitat:
Also folgende Aufgabe:
Ich will einen Automatischen Test, dazu habe ich ein C# Projekt, dass ich vor dem Test ausführen muss, dieser hinterlegt einen Wert, dieser soll dann mit UnitTest bzw CodedUI Test zum Test mit Assert verglichen werden


Das solltest du genauer erklären (zum Beispiel wofür du vorher das Projekt starten mußt, oder meinst du eher ein Executable anstatt Projekt) klingt nach einer eher unüblichen Abhängigkeit für einen Unittest.
rakize Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 25.11.14 14:28 
Also direkt ein Unit Test dürfte es nicht sein, da der Unit Test nur die Klassen testet nicht das komplette Projekt, deswegen bin ich leicht verwirrt.

Ich muss das Projekt starten, da das Projekt mir den Wert liefert den ich teste. Das Projekt ist schon ein C# WindowsForm Projekt. Unit test war nur ein Beispiel. Das Ziel ist es ein Test-Projekt zu erstellen, dass mein Projekt öffnen durchlaufen lässt und der Wert der geliefert wird wird dan nmit ASSERT überprüft.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.11.14 16:04 
Zitat:
Also direkt ein Unit Test dürfte es nicht sein, da der Unit Test nur die Klassen testet nicht das komplette Projekt, deswegen bin ich leicht verwirrt.


Ich auch ;) Solange du nicht relativ genau benennen kannst was du da tust kann man dir dabei nicht helfen. "Ich mache irgendwas irgendwie. Hilfe!" ist da nicht zielführend.
Macht du jetzt einen Unittest einen UI Test oder was anderes? Und wenn ja welches Tool benutzt du bzw. machst du das selber?
rakize Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 25.11.14 16:22 
Ich hab ein C# Projekt. Dieses startet per SPS einen Test und übergibt mir einen Wert zb False oder True und dieser Wert soll getestet werden.
Ich muss einen Test-Projekt also eine *.dll erstellen, dass mein Projekt ausführt und den Wert übergibt und Assert vergleicht. Also wenn Wert = true dann Test erfolgreich. Hoffe war bisschen ausführlicher.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.11.14 17:18 
Das wäre dann ein UnitTest der einfach die Assembly deines C# Projects benutzt und da denn passenden Code den du testen willst aufruft und dessen return prüft.
Da wird dann aber nicht dein Projekt gestartet oder müßte gestartet werden sondern der Test benutzt einfach den entscheidende Code (bzw. die Assembly) des zu testenden Projekts.
rakize Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 25.11.14 17:40 
Deine variante mit unit test und assembly hatte ich schon versucht. Leider nicht erfolgreich. Weil der unit test nicht wartet auf ende meines Projektes sondern direkt im code sucht und so den falschen wert überprüft. Es müsste ne andere Möglichkeiten dieses testes geben?
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Di 25.11.14 17:57 
Zitat:
Ich hab ein C# Projekt.

Projekt Nr.1

Zitat:
Dieses startet per SPS einen Test

Aufgabe 1 des Projekt Nr.1: Auf einer Speicherprogrammierbaren Steuerung(SPS) eine Funktion "Test" aufrufen?

Zitat:
und übergibt mir einen Wert zb False oder True

Aufgabe 2 des Projekt Nr.1: Einen Wert an "mir" übergeben. Wer ist "mir" ?

Zitat:
und dieser Wert soll getestet werden.

Von "mir" nimmt man an? Mit was soll verglichen werden? Mit dem Ergebnis der Funktion "Test" der SPS?

Zitat:
Ich muss einen Test-Projekt also eine *.dll erstellen,

Es gibt also ein Test-Project, nennen wir es Projekt Nr.2,
das eine DLL benötigt die von dir erstellt werden soll Projekt Nr.3

Zitat:
dass mein Projekt ausführt und den Wert übergibt und Assert vergleicht.

Also mit "mein Projekt" ist hier ist wohl Projekt Nr.1 gemeint und damit ist auch das Rätsel um "mir" gelöst.
Projekt Nr.1 gibt einen Wert zurück

Zitat:
Also wenn Wert = true dann Test erfolgreich

Project Nr.3 vergleicht den Rückgabewert und Prüft das Ergebnis mit Assert()

Zitat:
Hoffe war bisschen ausführlicher.

Eher verwirrend..., versuch die Gedanken zu ordnen bevor du den Sachverhalt beschreibst.
Wer sind die Beteiligten, wer hat welche Aufgabe.

Zum eigentlichen Problem:
Zitat:
Urgendwie hab ich das Problem das Projekt vorher starten zu lassen und sofort danach den Test ausführen zu lassen.

- Die DLL (Projekt3) wird vom Testframwork (Projekt2) geladen.
- Das Testframwork ruft eine von der DLL exportierte Testfunktion auf.
- Die Testfunktion startet Projekt1 (z.B. per CreateProcess eventuell mit Parameter), wartet auf das Beenden des Programms und wertet den Rückgabewert aus (GetExitCodeProcess).
- Projekt1 erkennt beim Start z.B. auf Grund des Parameters was zu tun ist und beendet sich danach mit entsprechendem Rückgabewert.

Wo ist jetzt das konkrete Problem?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.11.14 18:04 
Zitat:
Weil der unit test nicht wartet auf ende meines Projektes sondern direkt im code sucht und so den falschen wert überprüft


Das ist eine Frage wie du den Test programmiert. Dein zu testendes Projekt selbst muß ja auch irgendwie feststellen das es jetzt den Wert hat und irgendwas damit tun. Auf diese Bedingung muß dein Test halt warten. Dazu kann es nötig sein das der zu testende Code diese Info auch irgendwie veröffentlicht.
rakize Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 25.11.14 18:18 
Zitat:

- Die DLL (Projekt3) wird vom Testframwork (Projekt2) geladen.
- Das Testframwork ruft eine von der DLL exportierte Testfunktion auf.
- Die Testfunktion startet Projekt1 (z.B. per CreateProcess eventuell mit Parameter), wartet auf das Beenden des Programms und wertet den Rückgabewert aus (GetExitCodeProcess).
- Projekt1 erkennt beim Start z.B. auf Grund des Parameters was zu tun ist und beendet sich danach mit entsprechendem Rückgabewert.

Wo ist jetzt das konkrete Problem?


Danke erstmal, dass du versuchst Übersicht an die Sache zu bringen :) Eigentlich ging deine Erklärung in die richtige Richtung, nur dass es kein Projekt 3 gibt. Also Projekt 1 bekommt durch starten und ausführen der SPS einen Parameter, und den will ich vergleichen mit Assert. Da ich mehrere dieser Projekte habe will ich sie durch einen automatischen test durchgehen lassen
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mi 26.11.14 19:06 
Ein Testframwork kann zur not auch eine Batchdatei sein, die alle zu testenden Projekte nacheinander ausführt.
Irgendwo musst du ja festlegen welche Tests durchzuführen sind.

Zitat:
Also Projekt 1 bekommt durch starten und ausführen der SPS einen Parameter, und den will ich vergleichen mit Assert.

Einen Parameter wird beim Start übergeben.
Beim Beenden erhält man einen Rückgabewert.
Wann und durch welches Ereignis wird Projekt 1 gestartet?
Startet Projekt 1 die Funktion der SPS?
Erhält Projekt 1 einen Rückgabewert der Funktion der SPS?
Was hat die DLL damit zu tun?

Ohne genauere Informationen kann man dir auch nicht helfen.
rakize Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 01.12.14 14:19 
Hallo, sorry erstmal für das späte posting.

ich konnte das Problem jetzt einkreisen. Ich habe folgenden Testcode:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
[TestInitialize]
public void Initialize()
{
    //DO Something
    async_notificationhandler += the_eventhandler(async_notificationhandler);
}

private void async_notificationhandler
{
test = test2
// test2 wird tick später geliefert, deswegen schlägt Assert fehl
// eigentlich müsste hier [TestMethod] erst anfangen

}

[TestMethod]
public void TestMethod1()
{
    Assert.AreEqual("test_test", test);
}

Mein Problem ist das private void async_notificationhandler tick später ausgeführt wird und das bekommt TestMethod1 nicht mit und deswegen schlägt der TEST fehl, weil test2 zu spät kommt. Wie im Code beschrieben müsste TestMethod1 solange gestoppt werden bis async_notificationhandler ausgelöst wird. Danke

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
rakize Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 05.12.14 00:52 
Kann mir denn keiner helfen?
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Fr 05.12.14 11:21 
Die Variable "Test" benötigt eigentlich drei Zustände "nicht zugewiesen", "True", "False".
Alternativ geht auch eine zweite Boolean-Variable, die den Zustand "Zugewiesen" als "True" oder "False" enthält.

In "TestMethod1()" muss dann einfach so lange gewartet werden, bis der Zustand "Zugewiesen" erreicht ist.

a) Erfolgt die Zuweisung und die Abfrage im selben Thread (Hauptthread) muss beim Warten "Application.DoEvents();" in einer Schleife aufgerufen werden, damit async_notificationhandler überhaupt auf das Ereignis reagieren kann.

b) Handelt es sich um zwei verschiedene Threads, muss der Zugriff auf die gemeinsame Variable mit "lock()" entsprechend abgesichert werden.