יום שישי, יוני 05, 2009

פרוייקט בTesting

בפרוייקט שלנו בTesting התבקשנו לפתח מערכת שרת לקוח בנקאית שמדברת עם מערכת של בסיסי נתונים.
מכיוון שאני איש קוד פתוח כמעט כל הטכנולוגיות יהיו תחת תחת רישיונות חופשים (פרט לקטעי קוד ב C# שאינני יודע מה הרישוי המתאים).

הכלים הנדרשים בשביל הפרוייקט -
לריצה :

מערכת דביאן התקנה בסיסית.
שרת mysql5.5
מפרש פייתון 2.5

לפיתוח:
אנו (אני ולאוניד) משתמשים במערכות kdevelop ו Visual Studio 2008 אולם אין שום השפעה לסביבת הפיתוח על הקוד.
הקוד משתמש בשני סוגים של Makefile אחד של cmake ואחד של VS2008.

בחרתי לפתח בפייתון בגלל שזה זמן מצויין ללמוד עוד שפה ועוד טכנולגיות.

צורת העבודה היא שימוש ב XMLRPC בשביל להעביר את המידע בן תוכנת הלקוח לתוכנת השרת.
כאשר שרת שמקבל פנויות XMLRPC הוא עובד מול בסיס הנתונים.

עדיין לא למדתי איך להגן על ההודעות ה XML (אני חושב להעביר אותן בתוך tunnel של SSH) מפני בעיות.
בחרתי בסגנון הזה לאחר שהתייעצתי עם מפתח נוסף עידו קנר שהציע מספר פתרונות להעברת האובייקטים והמליץ על הסגנון הזה.

ולת'כלס:
על מנת להרים שרת xmlrpc פשוט אפשר להשתמש בקוד פייתון הבא :


#! /usr/bin/env python

import SocketServer
from SimpleXMLRPCServer import SimpleXMLRPCServer,SimpleXMLRPCRequestHandler

# Threaded mix-in
# Use it as asynchronic (Fire and forget)
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass

# The object that will be used to publish the functions
class TestObject:
# Just some foo function
def foo(self, x, y):
s = str(x)
return "Fooish function with (" + str(x) + "," + str(y) + ")"


# Instantiate and bind to localhost:8080
server = AsyncXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler)

# Registar the listMethod function
server.register_introspection_functions()

# Register example object instance
server.register_instance(TestObject())

# run!
server.serve_forever()


לאחר מכאן נרצה להוסיף קצת התחברות של MySQL:


#! /usr/bin/env python

import SocketServer
import MySQLdb

from SimpleXMLRPCServer import SimpleXMLRPCServer,SimpleXMLRPCRequestHandler

# Threaded mix-in
# Use it as asynchronic (Fire and forget)
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass

# The object that will be used to publish the functions
class TestObject:
# Just some foo function
def foo(self, x, y):
s = str(x)
return "Fooish function with (" + str(x) + "," + str(y) + ")"

# Make a connection for each query
def showTables(self):
Con = MySQLdb.Connect(host="127.0.0.1", port=3306, user="user", passwd="password")
Cursor = Con.cursor()
sql = "show databases;"
Cursor.execute(sql)
Results = Cursor.fetchall()
Con.close()
return Results


# Instantiate and bind to localhost:8080
server = AsyncXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler)

# Registar the listMethod function
server.register_introspection_functions()

# Register example object instance
server.register_instance(TestObject())

# run!
server.serve_forever()

בחרתי להשתמש בpass רק בשביל שיטת השגר ושקח (ואולי זה לא ממש נכון וצריך להשתמש באותו הconnection) הרעיון הכללי הוא לתת ל MySql לשבור את הראש בניהול החיבורים.
צריך לעבוד על זה עוד קצת בשביל להביא את זה למצב תקין וטוב.


לעצלני ה C# ניתן הקטע הבא (לקוח ) - אני בטוח שתסדרו מצויין (xmlrpc.net) :

using CookComputing.XmlRpc;

public struct SumAndDiffValue
{
public int sum;
public int difference;
}

[XmlRpcUrl("http://www.cookcomputing.com/sumAndDiff.rem")]
public interface ISumAndDiff : IXmlRpcProxy
{
[XmlRpcMethod]
SumAndDiffValue SumAndDifference(int x, int y);
}

איך מרימים מערכת ?
משתמשים בסביבת הוירטואליזציה החביבה עליכם אני אישית מעדיף את qemu אבל כל אחד יכול להשתמש במה שהוא הוא אוהב.
אז :


qemu-img create -f qcow foo.img 1GB
qemu -boot d -cdrom debian-501-i386-netinst.iso -hda foo.img

לאחר התקנה של כל התלויות שירשמו והתקנת החבילות של הסביבה עצמה .

ה Testing עצמו :
יתבצע באמצעות TAP או cucumber או כל סביבה אחרת שהבודקים ירצו (רק שתיהיה חופשית).

אין תגובות:

הוסף רשומת תגובה