Wie @Kie erwähnt, configure_endpoint
Implementierung wird nicht genug sein, wenn Sie die gesamte Server-Seite in Selenium Python-Code stubeln werden. Sie benötigen einen Webserver oder was auch immer, der über HTTP Anfragen aus der Testumgebung beantwortet.
Es sieht so aus, als ob die Frage teilweise das Testen von clientseitigem Code betrifft. Was ich sehe, ist, dass Sie versuchen, unit-Test für clientseitige Logik zu machen, aber Integrationstestsuite verwenden, um diese Logik zu überprüfen (es ist seltsam).
Die Hauptidee ist wie folgt.
Sie versuchen, clientseitigen Code zu testen. Also, machen wir Mocks clientseitig! Weil dieser Teil des Codes vollständig clientseitig ist.
Wenn Sie tatsächlich Mocks haben wollen, keine Stubs (beachten Sie den Unterschied hier: https://stackoverflow.com/a/3459491/882187) ist es eine bessere Möglichkeit, HTTP-Anfragen in Ihrem Javascript-Code zu verspotten. Nur weil Sie einen clientseitigen Code testen, nicht einige Teile der serverseitigen Logik.
Es von jeder Server-Seite isoliert ist - ist eine großartige Idee, die Sie lieben würden, wenn Ihr Projekt wachsen wird, während mehr und mehr Endpunkte erscheinen werden.
Zum Beispiel können Sie die folgende Methode verwenden:
var restResponder = function() { // the original responder your client-side app will use
this.getCurrentPresident = function(successCallback) {
$.get('/presidents/current', callback);
}
};
var createMockResponder = function(president, party){ // factory that creates mocks
var myPresident = president;
var myParty = party;
return function() {
this.getCurrentPresident = function (successCallback) {
successCallback({"name": myPresident, "party": myParty});
}
};
}
// somewhere swap the original restResponder with new mockResponder created by 'createMockResponder'
// then use it in your app:
function drawColor(restResponder, backgroundEl) {
restResponder.getCurrentPresident(function(data){
if (data.party == "Democrat") $(backgroundEl).style('background-color', 'blue')
else if (data.party == "Republican") $(backgroundEl).style('background-color', 'red')
else console.info('Some strange response from server... Nevermind...');
});
}
Praktisch diese Implementierung hängt davon ab, was Sie haben auf der Client-Seite als Rahmen. Wenn jQuery
, dann ist mein Beispiel genug, aber es sieht sehr wortreich aus. Falls Sie etwas weiter fortgeschritten ist, wie AngularJS
haben, können Sie das gleiche in 2-3 Zeilen Code tun:
// Set up the mock http service responses
$httpBackend = $injector.get('$httpBackend');
// backend definition common for all tests
authRequestHandler = $httpBackend.when('GET', '/auth.py')
.respond({userId: 'userX'}, {'A-Token': 'xxx'});
Überprüfen Sie die Dokumentation aus: https://docs.angularjs.org/api/ngMock/service/ $ httpBackend
Wenn Sie immer noch halten Sie sich an die Idee, dass Sie Mocks innerhalb Selenium Tests benötigen, bitte versuchen Sie dieses Projekt: https://turq.readthedocs.io/en/latest/
Es dient mit Python DSL zur Beschreibung von REST-Respondern. Mit turq
Ihre Mocks werden wie folgt aussehen:
path('/presidents/current').json({'name':'Barack Obama', 'party': 'Democrat'}, jsonp=False)
Auch würde ich empfehlen, Stubs statt Mocks zu versuchen, diesen Python-Modul verwenden: mock-server
https://pypi.python.org/pypi/mock-server/0.3.7 Sie erforderlich sind, um das Verzeichnis-Layout entsprechenden Pre-besiedelten erstellen JSON-Antworten und Hinzufügen eines Boilerplate-Codes, um die mock-server
Antwort auf 'localhost: 8080' zu machen. Die Verzeichnisstruktur für Ihr Beispiel wie folgt aussehen:
stub_obama/
presidents/
current/
GET_200.json # will contain {"name": "Barack Obama", "party": "Democrat"}
stub_trump/
presidents/
current/
GET_200.json # will contain {"name": "Donald Trump", "party": "Republican"}
Aber die mock_server
auf Tornado basiert, ist es sehr schwer Lösung für in Tests mit, denke ich.
Ich hoffe, meine Antwort ist hilfreich und informativ. Willkommen, um es zu diskutieren! Ich habe jede Menge Projekte mit Selenium gemacht, große und kleine Tests, getestet auf Client- und Server-Seite.
Kein load_web_app() lädt einfach die HTML/Js-Datei im Browser mit Selenium. Ich muss das Backend verspotten, indem ich einen API-Server erstelle, mit dem sich die Web-App verbindet. Dieser Mock-Server sollte innerhalb der Testumgebung konfigurierbar sein. – Baz
Haben Sie einen guten Grund, das zu testende System weit entfernt von der getesteten Client-Geschäftslogik zu isolieren, anstatt näher dran zu sein? (Ich gehe davon aus, dass Sie eine bereits gut getestete Bibliothek für den Netzwerkzugriff verwenden und dies nicht selbst programmieren. Falls ja, müssten Ihre Tests natürlich auch diesen Teil abdecken.) –
Die API ist bereits mit Tests abgedeckt. Diese Tests umfassen das Aufrufen der API und das Testen, dass die richtige Antwort empfangen wurde. Ich möchte nun den Fluss innerhalb der Web-App testen und testen, ob sich die App für die Browser, die ich unterstützen möchte, wie erwartet verhält. Mit anderen Worten, ich möchte das Frontend als Subsystem behandeln und Subsystemtests dafür schreiben. – Baz