#
PyDev - Python IDE (Python Development Enviroment for Eclipse) version 0.9.8.2 has been released.
Check the homepage (http://pydev.sourceforge.net/
) for more details.
Download
-----------------------------------------------------
Current release: 0.9.8.2.
- Use the Eclipse update manager: http://pydev.sf.net/updates/
- Get zip from SourceForge :http://www.sourceforge.net/projects/pydev/

Requirements:
-----------------------------------------------------
- Eclipse 3.1 (the SDK is required)
- Python 2.3.x or 2.4.x
- Java 1.4 or higher
Instructions:
-----------------------------------------------------
Fast install: just go to the update manager (inside the help menu) and add update site: http://pydev.sf.net/updates/
(eclipse should do the rest)
An alternative is just getting the zip file and extracting it yourself in eclipse.
If you choose to do it, just make sure the plugins folder is extracted on top of the eclipse plugins folder.
Important:
-----------------------------------------------------
If you have version 0.9.6 or earlier installed, you must remove it and all previous versions
before installing the latest version.
一直沒有什么機會采用ww2去做項目,都是在用struts,正好下周有個項目,準備采用webwork/xwork,放棄struts.同時也開始我的ww2之旅.
I like it o_o
將上面的代碼重構了一下,并且添加了cookies,這樣我們就不需要每次登陸了
1
#!/usr/bin/python
2
# -*- coding: UTF-8 -*-
3
4
import urllib
5
import cookielib, urllib2
6
import os
7
import re
8
9
class Fun:
10
def __init__(self,username,password,times=1,\ dataFileName='fun.data',loginurl='',posturl='',\ proxies={},pform=None,cookies=None):
11
print '初始化'
12
self.username=username
13
self.password=password
14
self.times = times
15
self.loginurl=loginurl
16
self.posturl = posturl
17
self.proxies=proxies
18
self.pform=pform
19
self.dataFileName=dataFileName
20
self.cookies=cookielib.CookieJar()
21
self.opener=None
22
23
def login(self):
24
"""
25
登陸
26
"""
27
print '登陸
'
28
loginparams = urllib.urlencode({'j_username':self.username,\ 'j_password':self.password,\
29
'UPC_REQUEST_URI':'*.do',\ 'UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG'})
30
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
31
32
self.pform = self.opener.open(self.loginurl,loginparams)
33
print '登陸成功'
34
35
def post(self):
36
"""
37
解析登陸完成的HTML頁面,獲取用戶相應的信息
38
"""
39
print '解析html頁面,獲取服務器端返回的內容'
40
content = '\n'.join(self.pform.readlines())
41
items = ["employeeName","department","workArea","workCity","fillInDate"]
42
values = []
43
for item in items:
44
pattern = "name=\""+item+"\"\s*(size=\"\d*\")?\s*\ value=\"(\S*(\s*\S*)?)\"\s*id=\""+item+"\""
45
matcher = re.search(pattern,content)
46
47
if matcher!=None:
48
values.append(matcher.groups()[1])
49
print values
50
else:
51
values.append('')
52
print '解析完成'
53
"""
54
提交日報
55
"""
56
57
print '讀取data文件:'+self.dataFileName
58
f = open(self.dataFileName)
59
contents = f.readlines()
60
61
#讀取data文件,判斷是否采用交互界面,還是采用data文件的數據
62
63
if contents[0]=='n':
64
c = raw_input('是否采用提交當天日志(y/n)?:')
65
if c=='n':
66
self.fillInDate = raw_input('請輸入提交日期(格式yyyy-mm-dd):')
67
projectId = raw_input('項目名稱代碼:')
68
workId = raw_input('具體事項:')
69
workContent = raw_input('工作內容:')
70
workNum = raw_input('正常工作時長:')
71
overtimeNum = raw_input('加班工作時長:')
72
else:
73
74
#是否采用文件中的時間,如果不采用,則采用當前時間
75
if contents[1]=='y':
76
self.fillInDate = contents[2]
77
78
projectId = contents[3]
79
workId = contents[4]
80
workContent = contents[5]
81
workNum = contents[6]
82
overtimeNum = contents[7]
83
84
#拼湊參數 o_o
85
paramsmap = {'employeeId':self.username,\ 'employeeName':values[0],\
86
'department':values[1],\ 'workArea':values[2],\ 'workCity':values[3],\ 'fillInDate':values[4],\
87
'detailList.projectId':[projectId],\ 'detailList.workId':[workId],\
88
'detailList.workContent':[workContent],\ 'detailList.workNum':[0], 'detailList.overtimeNum':[8]}
89
90
keys = paramsmap.keys()
91
for key in keys:
92
print key,':',paramsmap[key]
93
94
postparams = urllib.urlencode(paramsmap)
95
print 'postparams:'+postparams
96
#提交
97
#opener = urllib2.build_opener(self.cookies)
98
print '開始提交日報'
99
result = self.opener.open(self.posturl,postparams)
100
#result = urllib2.urlopen(posturl,postparams)
101
#todo:解析提過完成頁面,獲取信息
102
#
103
result.close()
104
print '日報填寫成功'
105
106
def close(self):
107
"""
108
"""
109
if not self.pform:
110
self.pform.close()
111
112
113
114
if __name__=='__main__':
115
#測試一下
116
try:
117
test = Fun(username='',password='',loginurl='',posturl = '')
118
test.login()
119
test.post()
120
test.close()
121
except IOError:
122
raise
初始化
登陸...
登陸成功
解析html頁面,獲取服務器端返回的內容
['\xd0\xec\xcf\xe9\xbe\xfc']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9', '\xbb\xaa\xb6\xab']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9', '\xbb\xaa\xb6\xab', '\xc4\xcf\x
be\xa9']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9', '\xbb\xaa\xb6\xab', '\xc4\xcf\x
be\xa9', '2005-09-24 17:45:40.0']
解析完成
讀取data文件:fun.data
detailList.workId : ['10003102\n']
employeeId : 404
workCity : 南京
detailList.projectId : ['JX0001\n']
detailList.overtimeNum : [8]
detailList.workNum : [0]
detailList.workContent : ['\xbb\xfc\xb2\xe9\xd0\xe8\xc7\xf3\xb7\xd6\xce\xf6\n']
fillInDate : 2005-09-24 17:45:40.0
department : 南京
workArea : 華東
employeeName : 徐祥軍
postparams:detailList.workId=%5B%2710003102%5Cn%27%5D&employeeId=404&workCity=%C
4%CF%BE%A9&detailList.projectId=%5B%27JX0001%5Cn%27%5D&detailList.overtimeNum=%5
B8%5D&detailList.workNum=%5B0%5D&detailList.workContent=%5B%27%5Cxbb%5Cxfc%5Cxb2
%5Cxe9%5Cxd0%5Cxe8%5Cxc7%5Cxf3%5Cxb7%5Cxd6%5Cxce%5Cxf6%5Cn%27%5D&fillInDate=2005
-09-24+17%3A45%3A40.0&department=%C4%CF%BE%A9&workArea=%BB%AA%B6%AB&employeeName
=%D0%EC%CF%E9%BE%FC
開始提交日報
日報填寫成功
摘要: 問題: 公司的日報,每天填寫的時候總是那么巨慢,都有點恐懼它了!
解決方案: 讓代碼幫我們每天定時提交,這樣就可以省下精力取吹牛去了
好了,開始吧: 有兩種思路,大概的描述一下如下...
閱讀全文
在上面篇文章,我們的測試代碼如下:
1
package com.martin.pdo;
2
3
import org.springframework.context.ApplicationContext;
4
5
import junit.framework.Assert;
6
import junit.framework.TestCase;
7
8
public class UserTest extends TestCase
{
9
10
public void testUser()
{
11
ApplicationContext context = JUnitTestHelper.getContext();
12
User user = (User) context.getBean("user");
13
User _u1 = new User();
14
_u1.setName("martin xus");
15
_u1.setSex('F');
16
_u1.setAge(100);
17
user.add(_u1);
18
19
Assert.assertNotNull(_u1.getId());
20
21
User _u2 = (User) user.loadByName("martin xus").get(0);
22
Assert.assertEquals(_u1.getId(), _u2.getId());
23
24
user.remove(_u2);
25
Assert.assertTrue(user.loadByName("martin xus").size() == 0);
26
}
27
28
}
29
而這些,必須要和spring&hibernate一起工作,必須保證數據庫操作正確,而我們需要的只是測試這個類的本身!
有必要連hibernate,spring一起測試嗎?當然沒有,測試,只需要保證本代碼完成相應的功能,即可.
那么就有必要更換測試方法:
mock便是首選,在這里我們選擇了jmock (http://www.jmock.org
)
1
package com.martin.mock;
2
3
import org.jmock.Mock;
4
import org.jmock.MockObjectTestCase;
5
6
import java.util.List;
7
8
/** *//**
9
* @author martin.xus
10
*/
11
public class UserTest extends MockObjectTestCase
{
12
13
public void testAdd()
{
14
Mock mock = mock(UserManager.class);
15
User user = new User();
16
mock.expects(once()).method("add").with(isA(User.class));
17
UserManager manager = (UserManager) mock.proxy();
18
19
user.setManager(manager);
20
user.add(new User());
21
mock.verify();
22
}
23
24
public void testLoadByName()
{
25
Mock mock = mock(UserManager.class);
26
User user = new User();
27
28
mock.expects(once()).method("loadByName").with(isA(String.class)).will(returnValue(List.class));
29
UserManager manager = (UserManager) mock.proxy();
30
31
user.setManager(manager);
32
user.loadByName("martin");
33
mock.verify();
34
}
35
36
public void testRemove()
{
37
Mock mock = mock(UserManager.class);
38
User user = new User();
39
40
mock.expects(once()).method("remove").with(isA(User.class));
41
UserManager manager = (UserManager) mock.proxy();
42
43
user.setManager(manager);
44
user.remove(user);
45
mock.verify();
46
}
47
}
ok,測試通過