日期:2014-05-17  浏览次数:20642 次

如何模拟已经登录
本人老程序猿,不过是ASP.net新人一枚,以前主要做桌面,最近才搞一个网络项目。

现在做的项目需要集成到公司网站上, 前提是只有登录后才能进入我们这个项目的主页面,没有登录会跳到登录界面。公司网站的代码我是拿不到的,公司IT也不可能来配合我们做测试,公司是比较大的外企。 目前是检查Session中当前的User是不是为空,还需要通过cookie里面的值来判断。 我需要模拟登录,设置session以及cookie等,让页面能够继续下去。 对原有公司网站系统,我唯一有的就是几个.net dll(没有代码), 里面有用户的数据类型,还有一个测试数据库,里面有用户类型,权限,客户信息等。 有啥好的办法模拟? 

------解决方案--------------------

public bool IsLoggedIn()
    {
        bool isLoggedIn = false;
        //for test
        if ( Dns.getHostName() == "TestServer") return true;

        isLoggedIn = PortalUser != null && PortalUser.UserType > eCentral.User.USR_ANONYMOUS ? true : false;
        return isLoggedIn;
    }



------解决方案--------------------
"我没有一个完全和公司网站相符的测试环境,只能在自己的windows server上面部署测试, 验证用户这一关,我在测试中希望绕过去。"

在跨域session,cookie共享时,调用方如果不在你的控制之下,你不修改代码造假是绕不过去的.

从这几行代码可以大约看出一些蛛丝马迹:

eCentral.Web.Menu menu = new MyCom.eCentral.Web.Menu();

...
        int result = ecSession.CheckPermission();
 
        if (result != MyCom.eCentral.Web.Session.SESSION_RET_SUCCESS)

...
     cookie = MyCom.eCentral.Web.HttpUtility.GeteCentralCookie();


这些都是不在你的控管访问内的,你也无法改变其内部逻辑,如果内部其中做了session/cookie一些动作,你在代码中采用11楼的跳过会直接出问题.

这个时候你就需要造假了,自己弄一个项目或者写一个dll

也取名以及命名空间为:

MyCom.eCentral.Web;
yCom.eCentral;
MyCom.eCentral;


然后这个项目里面仅仅实现你需要的几个方法,返回固定的静态数据,

然后将这个造假项目引入到你的项目中,这个时候调试的就是可以随时修改这个造假项目的静态数据来达到测试目的.

从你给出的示例来看,涉及到授权认证的应该不多,顶多获取菜单列表.

这样的好处在于:
1. 你上线的时候几乎可以不修改任何代码,只需要替换reference的dll成你公司的正式dll即可
2. 你调试的时候可以轻易修改造假dll返回的内容进行覆盖测试

缺点在于:
1. 如果涉及到该dll过多,你需要造假的代码就比较多
2. 因为是模拟数据,你需要在项目整合测试的时候,进行正式dll的整合测试


还有一个方法二:
如果你公司代码没有混淆加密,不用自己写代码,将你公司的dll用reflector反编译出来

自己斟酌.