#
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.
一直沒有什么機(jī)會(huì)采用ww2去做項(xiàng)目,都是在用struts,正好下周有個(gè)項(xiàng)目,準(zhǔn)備采用webwork/xwork,放棄struts.同時(shí)也開始我的ww2之旅.
I like it o_o
將上面的代碼重構(gòu)了一下,并且添加了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頁(yè)面,獲取用戶相應(yīng)的信息
38
"""
39
print '解析html頁(yè)面,獲取服務(wù)器端返回的內(nèi)容'
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
提交日?qǐng)?bào)
55
"""
56
57
print '讀取data文件:'+self.dataFileName
58
f = open(self.dataFileName)
59
contents = f.readlines()
60
61
#讀取data文件,判斷是否采用交互界面,還是采用data文件的數(shù)據(jù)
62
63
if contents[0]=='n':
64
c = raw_input('是否采用提交當(dāng)天日志(y/n)?:')
65
if c=='n':
66
self.fillInDate = raw_input('請(qǐng)輸入提交日期(格式y(tǒng)yyy-mm-dd):')
67
projectId = raw_input('項(xiàng)目名稱代碼:')
68
workId = raw_input('具體事項(xiàng):')
69
workContent = raw_input('工作內(nèi)容:')
70
workNum = raw_input('正常工作時(shí)長(zhǎng):')
71
overtimeNum = raw_input('加班工作時(shí)長(zhǎng):')
72
else:
73
74
#是否采用文件中的時(shí)間,如果不采用,則采用當(dāng)前時(shí)間
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
#拼湊參數(shù) 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 '開始提交日?qǐng)?bào)'
99
result = self.opener.open(self.posturl,postparams)
100
#result = urllib2.urlopen(posturl,postparams)
101
#todo:解析提過完成頁(yè)面,獲取信息
102
#
103
result.close()
104
print '日?qǐng)?bào)填寫成功'
105
106
def close(self):
107
"""
108
"""
109
if not self.pform:
110
self.pform.close()
111
112
113
114
if __name__=='__main__':
115
#測(cè)試一下
116
try:
117
test = Fun(username='',password='',loginurl='',posturl = '')
118
test.login()
119
test.post()
120
test.close()
121
except IOError:
122
raise
初始化
登陸...
登陸成功
解析html頁(yè)面,獲取服務(wù)器端返回的內(nèi)容
['\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
開始提交日?qǐng)?bào)
日?qǐng)?bào)填寫成功
摘要: 問題: 公司的日?qǐng)?bào),每天填寫的時(shí)候總是那么巨慢,都有點(diǎn)恐懼它了!
解決方案: 讓代碼幫我們每天定時(shí)提交,這樣就可以省下精力取吹牛去了
好了,開始吧: 有兩種思路,大概的描述一下如下...
閱讀全文
在上面篇文章,我們的測(cè)試代碼如下:
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一起工作,必須保證數(shù)據(jù)庫(kù)操作正確,而我們需要的只是測(cè)試這個(gè)類的本身!
有必要連hibernate,spring一起測(cè)試嗎?當(dāng)然沒有,測(cè)試,只需要保證本代碼完成相應(yīng)的功能,即可.
那么就有必要更換測(cè)試方法:
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,測(cè)試通過