Archiv für den Monat August 2011

LINQ und Fakes

Kürzlich stand ich vor dem Problem, dass ich einen Unit Test schreiben musste, bei dem geprüft wird, ob eine spezielle Methode aufgerufen wurde.

Beispiel: Ich habe einen Controller, der Daten von der DB in die UI lädt. Der Controller ist meine zu testende Unit. Nun will ich prüfen, ob der Controller, wenn er den Load-Befehl erhält, diesen auch korrekt an mein Repository weiterleitet. Die DB Logik habe ich dazu mit FakeItEasy gefakt. Über MustHaveHappened() kann man prüfen, ob auf dem Fake die Save-Methode aufgerufen wurde (vgl. diesen Artikel zu dem Thema).

Nun gibt es ein Problem:

1: var controlsToTranslate = from ctrl in _form.TranslatableControls select

ctrl.TranslationKey;

2: var translations = _translationRepository.LoadTranslations(_languageId,

controlsToTranslate);

Ich ermittle den zu übergebenden Parameter in meiner zu testenden Klasse per LINQ, sodass der Aufruf von Load auf meinem Repository als Parameter eine LINQ Expression ist. Damit ist der Parameter ein Objekt, welches ich in meinem Unit Test nicht nachstellen kann, sprich die Prüfung von FakeItEasy mit (vgl. Zeile 2)

   1: Fake.A

   2:     .CallTo(() => translationRepository.LoadTranslations(0, translationKeys))

   3:     .MustHaveHappened();

 

wird nie erfolgreich sein, da FakeItEasy einen Equals-Vergleich ausführt. Der zweite Parameter in meinem    Test wird immer ein anderes Objekt sein, als das, was in der zu testenden Unit (dem Controller) erzeugt wird.

Die Lösung sieht wie folgt aus:

   1: Fake.A

   2:     .CallTo(() => translationRepository.LoadTranslations(0, 

   3:      A<IEnumerable<string>>.That.Matches(x => x.SequenceEqual(translationKeys))))

   4:     .MustHaveHappened();

 

In Zeile 3 steht die Lösung für meinen Parameter. Hier sage ich, dass der Parameter vom Typ IEnumerable<string> sein muss und dass lediglich die Reihenfolge der Strings, wie sie in IEnumerable stehen, gleich sein muss. Damit habe ich den Equals-Vergleich für Parameter 2 anders implementiert.

Werbeanzeigen

Meine Top 7 CIO Topics der nächsten Monate

Ständig liest man von den Zukunftsprognosen diverser Institute wie der Bitkom oder von den kommenden Projekten diverser CIOs großer bis sehr großer Firmen. Hingegen sind Artikel zu den Themen, die die CIOs in KMUs beschäftigen, eher rar. Deshalb habe ich mich entschlossen unsere Projekte und Schwerpunkte der nächsten 12 Monate wiederzugeben:

Social Media:

Trotz unserer Größe (ca. 80 Mitarbeiter) und unserer weniger IT-affinen Branche (Edelstahl) stehen die nächsten 12 Monate ganz im Zeichen des aktuellen Hype Themas Social Media. Intern wollen wir primär das Thema Wissensmanagement in unserem auf SharePoint basierendem Intranet mit Blogs und Wikis aufgreifen. Extern wollen wir v.a. Twitter, Xing und Facebook einsetzen, um unsere Unternehmensstrategien zur Kommunikation, Mitarbeiterakquise, Kundenbindung und zum Marketing bzw. zur Imagebildung zu verstärken respektive zu erweitern. Ein Ansatz hierfür ist z.B. eine Umfrage unter unserer Facebook Fangemeinde, die über neue Funktionen für unsere Homepage (vgl. nächstes Projekt) abstimmen kann. Rückenwind erhält die IT durch eine sehr große Gruppe von ca. 15 Digital Natives, sowie der Geschäftsführung selbst. Nicht zu kurz kommt dabei das “Abholen” und Schulen der Mitarbeiter (vgl. übernächstes Projekt).

Webseite:

Ohne einen Webauftritt geht heutzutage gar nichts mehr. Obwohl wir hier gut aufgestellt sind, werden die nächsten 12 Monate richtig spannend: Unter anderem stehen ein neues Kundenportal (myheco), eine noch stärkere Zusammenführung von Website und unserem hauseigenen ERP (z.B. die direkte Anfrageübernahme), sowie ein Online Shop auf der Agenda. Darüber hinaus werden unsere sehr gefragten Datenblätter (über 3000 Downloads im Monat) um geniale Neuerungen ergänzt. Aber die vermutlich wichtigste Neuerung dürfte der verstärkte Ausbau der Mehrsprachigkeit sein, welcher mit der internen Internationalisierung unserer ERP-Lösung einhergeht. Kleine Anmerkung am Rande: Ich will demnächst hierzu eine auf .NET basierende Bibliothek als Open Source Projekt frei zur Verfügung stellen! Wenn sich überraschenderweise herausstellen sollte, dass wir frühzeitig mit den Projekten fertig werden, dann ist bereits eine mobile App angedacht. Ein interessantes Thema, allerdings für uns noch nicht in dem Maße relevant, wie es in anderen Branchen der Fall ist.

Abholen der Mitarbeiter:

Die IT ist ein Dienstleister. Das sollte inzwischen bei allen IT Leitern angekommen sein. Wir werden diesem Paradigma gerecht, indem wir regelmäßig unsere Mitarbeiter schulen und informieren. So wird es in den nächsten 12 Monaten verstärkt Schulungen in den Bereichen Social Media (wie sichere ich mein Facebook Profil ab, wie verhalte ich mich im Web 2.0) und Sicherheit (Dos und Don’ts) geben. Aber auch die IT selbst wird wöchentlich in fachabteilungsübergreifenden Geschäftsprozessen durch den Geschäftsführer persönlich geschult, um der Rolle als sogenannter Business Enabler noch besser gerecht zu werden. Des Weiteren machen wir halbjährlich Umfragen bzgl. der Zufriedenheit mit der IT. Last but not least geben wir streng nach dem Motto “mehr Transparenz für ein besseres Verständnis” im sechs Monatsrhytmus einen Ist-Soll-Abgleich für die immer ein Jahr im Voraus geplanten Großprojekte der Administration, von denen die Anwender direkt und im stärkeren Umfang betroffen sind, heraus. Ich will an dieser Stelle anmerken, dass ich hiermit keinesfalls Projektmanagement mit weitreichender und starrer Planung (Stichwort Wasserfallmodell in der Softwareentwicklung) gutheiße.

Virtualisierung:

Während wir immer wieder Cloud Computing für uns evaluieren, ist Virtualisierung bei uns inzwischen nicht mehr wegzudenken. Die nächsten 12 Monate werden wir nutzen, um auch die letzten Server, bei denen dies möglich ist, noch zu virtualisieren, um den Return on Investment zu steigern und die Systemlandschaft zu konsolidieren.

Sicherheit:

Das wichtigste Projekt in der Administration wird das Thema Sicherheit in all seinen Facetten sein. Neben der zuvor erwähnten Schulung der Mitarbeiter, gibt es eine Vielzahl an Punkten, die hier abzuarbeiten sind: Backupkonzepte, Notfallstrategien, Firewalls, usw.. Dabei wollen wir es vor allem den Anwendern leicht machen, um die Reaktionszeit der IT zu verkürzen. So führen wir eine spezielle Seite im Intranet ein, die kurz und prägnant eine Anleitung samt Kontaktdaten enthält. Zusätzlich wird mit jeder Abteilung ausgiebig besprochen, welche Daten und Programme essentiell und welche Ausfallzeiten annehmbar sind. Am Ende steht ein sogenannter Disaster Recovery Plan, der jährlich neu evaluiert wird. Entsprechende Ausfall- und Wiederherstellungstests werden je nach Notwendigkeit im 3-, 6- oder 12-Monatstakt durchgeführt. Von den IT-lern wird jeder Einzelne (also nicht nur die Admins) in diesen Prozessen geschult. Auch in der Web- und Softwareentwicklung werden wir nochmal diverse Funktionalitäten auf den Prüfstand stellen! In diesem Kontext überlegen wir, ob wir einen externen Dienstleister ins Boot holen, um unsere Webseite auf Schwachstellen abzuklopfen. Zu guter Letzt geht das Ganze auch mit einer kritischen Betrachtung durch unseren Datenschutzbeauftragten einher.

Outsourcing:

Ich kann mir schon vorstellen, wie gerade ein Raunen durch die Blogosphäre geht. Aber im Gegensatz zu der ein oder anderen Firma, die Arbeitsplätze ins Ausland verlagert, geht es bei uns darum mit externen Dienstleistern aus Deutschland Projekte schneller umzusetzen und dabei noch Geld einzusparen. Obwohl wir bereits mehrfach erfolgreich auf externe IT-ler gesetzt haben, wollen wir das in den nächsten Monaten noch häufiger tun. Im Gegenzug sollen Schulungen und Konferenzbesuche dezimiert werden. Jeder dürfte das damit einhergehende Problem kennen, dass der Teufel immer im Detail steckt und dass das Gelernte sich immer nicht auf das konkrete Problem anwenden lässt. Deshalb finde ich – speziell in Anbetracht der Möglichkeiten mit Skype und Teamviewer – das kurzfristige Hinzuziehen von Spezialisten äußerst hilfreich. Quasi die Just-in-time-Lieferung für die IT Branche. Speziell im Bereich der Softwareentwicklung kann hier massiv an Zeit eingespart werden, wenn man Architekturentscheidungen nochmals von Dritten in Frage stellen oder sich bei sogenannten “Code Smells” Ratschläge geben lässt. Ebenfalls ein gutes Szenario für neue Technologien sind kleine, nicht ausprogrammierte Prototypen, die man dann als Gerüst für den weiteren Ausbau verwenden kann. Inzwischen kann ich behaupten, dass ich ein regelrechter Fan von diesen kleinen, aber regelmäßigen Online Meetings bin.

Mitarbeitergespräche:

Jeden Monat greife ich die Thematik Mitarbeitergespräche als eines meiner Lieblingsthemen in diesem Blog auf. Und wie ich meine zu Recht, da ich es für das wahrscheinlich wertvollste Instrument zur Mitarbeiterführung halte. Für mich ist das Thema immer noch zu selten auf der Agenda von CIOs oder – wenn es denn auf der Agenda steht – ist es für die Meisten eine lästige Pflicht für den Vorgesetzten, die es ohnehin nicht richtig umsetzen. Da ich bereits mehrere Artikel dazu geschrieben habe, werde ich jetzt nicht weiter darauf eingehen. Jedoch sei dieses Mittel jedem CIO, egal bei welcher Abteilungsgröße, ans Herz gelegt.

Nützliche Git und Bash Shell Tipps

In dem Artikel Git Aliase habe ich kurz die “.gitconfig” erwähnt. Da so gut wie jeder Entwickler mehrere Maschinen nutzt und normalerweise gerne mit den gleichen Einstellungen arbeitet, gilt es die benötigten config-Files zu synchronisieren. Neben der zuvor erwähnten Datei sollte man auch noch die “.bashrc” (ebenfalls im Homeverzeichnis des Users) sichern, die die Einstellungen für die Bash Shell enthält. Ich für meinen Teil habe das so gemacht, dass ich die Dateien in einem Verzeichnis, welches ich über alle meine Maschinen synchronisiere, abgelegt und mit hard links darauf referenziert habe. Windows bietet dafür den Befehl “mklink” an. Für die ganz faulen Tipper unter euch, poste ich hier den Inhalt aus meinen 2 config-Files:

.gitconfig

[alias]
    review = log -1 –patch
    unstage = reset head
    aa = add –all
    au = add –update
    s = status
    p = pull
    l = log –oneline -10
    k = !gitk –all & –all &
    aua = !git add –update && git commit –amend –reuse-message=HEAD
    aaa = !git add –all && git commit –amend –reuse-message=HEAD
    amend = commit –amend –reuse-message=HEAD
    aucp = !sh -c ‚git add –update && git commit -m \"$1\" && git push‘ –
    aacp = !sh -c ‚git add –all && git commit -m \"$1\" && git push‘ –

.bashrc

alias g=’git‘

Außerdem will ich noch kurz auf Einstellungen für die Bash Shell verweisen, welche ich sinnvollerweise von Alexander Groß übernommen habe:

imageimage

 

Öffnet dafür die Bash Shell, klickt rechts auf dem Rahmen und geht in Standardwerte. Schaut euch insbesondere die Fensterpuffergröße und die Bearbeitungsoptionen an. Um auch diese Einstellungen einfach auf alle Maschinen zu bringen, könnt ihr euch den Registry-Schlüssel “HKEY_CURRENT_USER\Console” exportieren.

Git Aliase

Wer wie ich nicht immer die gleichen 3 Befehle zum Hinzufügen, Commiten und Pushen von Änderungen zum Git Repository ausführen will, kann sich sogenannte Aliase definieren. Der folgende Screenshot zeigt 2 Aliase, die ich mir in meine benutzerbezogene “.gitconfig” eingetragen habe. Zeile 1 fügt lediglich geänderte Dateien hinzu, während Zeile 2 alle Änderungen hinzufügt:

 image

Hier noch textuell:

!sh -c ‚git add –update && git commit -m \"$1\" && git push‘ –

!sh -c ‚git add –all && git commit -m \"$1\" && git push‘ –

Alternativ sollten auch folgende Zeilen funktionieren:

"!f() { git add –-update; git commit -m \"$1\"; git push; }; f"

"!f() { git add –all; git commit -m \"$1\"; git push; }; f"

 

Beachtet, dass ihr die Aliase nicht über den entsprechenden Git Befehl anlegen solltet, da es sonst ggf. Probleme mit den Hochkommata gibt. Editiert stattdessen die besagte .gitconfig in eurem Homeverzeichnis. Das könnt ihr über den Befehl

vim .gitconfig

machen, wenn ihr euch im richtigen Pfad befindet.

Danke an dieser Stelle an Alexander Groß für seine Hilfe dabei.

%d Bloggern gefällt das: