物联网笔记-----------Django单元测试,Django bug(二)

来源:互联网 发布:ubuntu 打字 编辑:程序博客网 时间:2024/05/29 12:21

一、学习链接:http://luliangok.iteye.com/

自身经历,测试APP,saler_test:

test_vendings.sql:

-- ------------------------------ Table structure for `vd_inforsales`-- ----------------------------DROP TABLE IF EXISTS `vd_inforsales`;CREATE TABLE `vd_inforsales` (  `SaID` bigint(20) NOT NULL AUTO_INCREMENT,  `SaTradeNum` varchar(50) NOT NULL,  `SaStartTime` datetime NOT NULL,  `SaInfors` text NOT NULL,  `SaTotalPrice` double(10,2) NOT NULL DEFAULT '0.00',  `SaCommInfors` text NOT NULL,  `SaPayState` int(11) NOT NULL DEFAULT '0',  `SaPayType` int(11) NOT NULL DEFAULT '0',  `SaState` int(11) NOT NULL DEFAULT '0',  `SaPayTime` datetime NOT NULL,  `SaPayTradeNum` varchar(60) NOT NULL,  `SaPfComm` double(10,2) NOT NULL DEFAULT '0.00',  `SaBussinComm` double(10,2) NOT NULL DEFAULT '0.00',  `SaPayPrice` double(10,2) NOT NULL DEFAULT '0.00',  `SaFinishTime` datetime NOT NULL,  `Ven_id` bigint(20) NOT NULL,  PRIMARY KEY (`SaID`),  KEY `VenID` (`Ven_id`),  CONSTRAINT `vd_inforsales_ibfk_1` FOREIGN KEY (`Ven_id`) REFERENCES `vd_vendings` (`VenID`),  CONSTRAINT `VenID` FOREIGN KEY (`Ven_id`) REFERENCES `vd_vendings` (`VenID`)) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8;

871234562017-08-16 15:52:28"proid":2,"name":"农夫山泉","count":1,"sinPrice":1.5,"toPrice":1.51.51112017-08-16 15:52:330002017-08-16 15:52:33123


views.py:

#-*- coding:utf-8 -*-import requestsimport timeimport jsonimport reimport osimport xlwtfrom datetime import datetime,time,datefrom django.utils import timezonefrom django.http import HttpResponsefrom django.conf import settingsfrom django.shortcuts import render,get_object_or_404from vd.models import Vendingpro,Productions,Vendings,Inforsalesfrom itsdangerous import TimedJSONWebSignatureSerializer as Serializerfrom itsdangerous import SignatureExpired, BadSignature, BadDataorder_count=1;#-------------------------------------------------------------------------------Token----auth--------------------------------------------------------------->s = Serializer(secret_key=settings.SECRET_KEY,salt='activate-salt');def genTokenSeq(venid='',token=''):if(venid!=''and token==''):return s.dumps({'venid': venid})else:try:data=s.loads(token);except SignatureExpired:msg = 'token expired'return [None, None, msg]except BadSignature as e:encoded_payload = e.payloadif encoded_payload is not None:try:s.load_payload(encoded_payload)except BadData:msg = 'token tampered'return [None, None, msg]msg = 'badSignature of token'return [None, None, msg]except:msg = 'wrong token with unknown reason'return [None, None, msg]if ('venid' not in data):msg = 'illegal payload inside'return [None, None, msg]msg = 'venid(' + data['venid'] + ') logged in by token.'#app.logger.info(msg)venid = data['venid']return [venid,msg]#-------------------------------------------------------------------------------Token----auth--------------------------------------------------------------->def certify(request):if request.method=="POST":try:venid=request.POST.get("venid",default="");#售货机编号except KeyError:return HttpResponse('no venid key');veniddb=get_object_or_404(Vendings,VenID=venid).VenID;if (venid==str(veniddb)):token=genTokenSeq(venid);return HttpResponse(token);else:return HttpResponse('login fail');else:return HttpResponse('method error')def handler(request):if request.method=="POST":try:token=request.POST.get("token",default='')#售货信息,得到的是ascii类型。list=genTokenSeq('',token);token_venid=list[0];venid=get_object_or_404(Vendings,VenID=token_venid).VenID;if token_venid!='' and int(token_venid)==venid:payType=request.POST.get("payType",default="")#支付类型changeType=request.POST.get('changeType',default='');logtext=request.POST.get("logtext",default="")#支付类型if changeType=='':sainfors=request.POST.get("sainfors",default='')#售货信息totalPrice=request.POST.get("totalPrice",default="")#售货总金额venid=request.POST.get("venid",default="")#售货机编号data = {'sainfor': sainfors, 'saTotalPrice': totalPrice,'venid':venid}if int(payType)==0 :SaTradeNum=tstamp_order();inforsales=save_inforsales(data,SaTradeNum);data['paytype']=payTypeinforsales.SaPayState=1;inforsales.SaPayType=data['paytype']inforsales.save();ret=json.dumps(inforsales.SaPayState)return HttpResponse(ret);#ret = requests.post("http://192.155.16.138:8080/sale/sale", data=data)#print(ret)#dictstr={};#dictstr['ret']=ret;if int(payType)==1 or int(payType)==2 or int(payType)==3 :'''SaTradeNum=tstamp_order();inforsales=save_inforsales(data,SaTradeNum);data['paytype']=payTypeinforsales.SaPayType=data['paytype']inforsales.save();userAction(logtext)ret={"SaTradeNum":SaTradeNum,"payqr":"https://www.baidu.com/ ","code":"1"}ret = json.dumps(ret)return HttpResponse(ret)'''###################modify######################SaTradeNum='123456';inforsales=save_inforsales(data,SaTradeNum);data['paytype']=payTypeinforsales.SaPayType=data['paytype']inforsales.save();userAction(logtext)ret={"SaTradeNum":'123456',"payqr":"https://www.baidu.com/ ","code":"1",'changeType':''}#---------------------------------------->ret = json.dumps(ret)return HttpResponse(ret)###################modify######################if int(payType)==4 or int(payType)==5:SaTradeNum=tstamp_order();inforsales=save_inforsales(data,SaTradeNum);ret={'SaTradeNum':SaTradeNum,'SaPayState':0,"payqr":"https://www.baidu.com/ "}ret = json.dumps(ret)return HttpResponse(ret)if int(payType)==6:SaTradeNum=tstamp_order();inforsales=save_inforsales(data,SaTradeNum);data['paytype']=payTypeinforsales.SaPayType=data['paytype']inforsales.save();ret={"SaTradeNum":SaTradeNum,"payqr":"https://www.baidu.com/ ","code":"6",'sainfors':sainfors}ret = json.dumps(ret)return HttpResponse(ret)else:SaTradeNum=request.POST.get('SaTradeNum',default='');inforsales=get_object_or_404(Inforsales,SaTradeNum=SaTradeNum)data = {'SaTradeNum': SaTradeNum, 'paytype': payType}if int(payType)==0 :data['payType']=payTypeinforsales.SaPayState=1;inforsales.SaPayType=data['paytype']inforsales.save();print('')#ret=json.dumps(inforsales.SaPayState)ret={"SaTradeNum":'123456',"payqr":"https://www.baidu.com/ ","code":'0','changeType':'changeType'}ret = json.dumps(ret)print(ret)return HttpResponse(ret);#ret = requests.post("http://192.155.16.138:8080/sale/sale", data=data)#print(ret)#dictstr={};#dictstr['ret']=ret;###################modify######################'''userAction(logtext)context={"SaPayState":inforsales.SaPayState}return render(request,'saler_test/handler.html',context)###################modify######################'''if int(payType)==1 or int(payType)==2 or int(payType)==3 :data['paytype']=payTypeinforsales.SaPayType=data['paytype']inforsales.save();ret={"SaTradeNum":SaTradeNum,"payqr":"https://www.baidu.com/ ","code":"1"}ret = json.dumps(ret)return HttpResponse(ret)if int(payType)==4 or int(payType)==5:ret={'SaTradeNum':SaTradeNum,'SaPayState':1,"payqr":"https://www.baidu.com/ "}ret = json.dumps(ret)return HttpResponse(ret)if int(payType)==6:data['paytype']=payTypeinforsales.SaPayType=data['paytype']inforsales.save();ret={"SaTradeNum":SaTradeNum,"payqr":"https://www.baidu.com/ ","code":"6",'sainfors':sainfors}ret = json.dumps(ret)return HttpResponse(ret)else:return HttpResponse('token error');except KeyError:return HttpResponse('no post someone key')else:return HttpResponse('method error');def tstamp_order():global order_count;date_time=datetime.now();h_m_s=date_time.strftime("%H:%M:%S");h,m,s=h_m_s.strip().split(':');tstamp=int(h)*3600+int(m)*60+int(s);#秒y_m_d=date_time.strftime("%Y%m%d");y_m_d=y_m_d[2:];saler_order=y_m_d+str(tstamp)+str(order_count);order_count=order_count+1;return saler_order;def save_inforsales(data,SaTradeNum):venid=get_object_or_404(Vendings,VenID=data['venid'])for key in data.keys():if key=="sainfor":sainfor_avail=re.search("\[.*\]", data['sainfor'])value=sainfor_avail.group().replace('[{', '').replace('}]', '').replace('{', '').replace('}', '');inforsales=Inforsales.objects.create(SaTradeNum=SaTradeNum,SaStartTime=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),SaInfors=value,SaTotalPrice=data['saTotalPrice'],Ven=venid,SaPayTime=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),SaFinishTime=datetime.now().strftime('%Y-%m-%d %H:%M:%S'));return inforsales;def checkstate(request):try:token=request.POST.get("token",default='')list=genTokenSeq('',token);token_venid=list[0];vendings=get_object_or_404(Vendings,VenID=token_venid)venid=vendings.VenIDif request.method=="POST" and token_venid!=''and int(token_venid)==venid:SaPayState=request.POST.get('paystate',default='');SaTradeNum=request.POST.get('SaTradeNum',default='');payType=request.POST.get("payType",default="")#支付类型data={'venid':venid,'SaTradeNum':SaTradeNum,'paytype':0,'SaPayState':SaPayState}#ret = requests.post("http://192.155.10.138:8080/sale/sale", data=data)ret={'SaTradeNum':SaTradeNum,'SaPayState':0,'payType':payType}if ret['SaPayState']==1:inforsales=get_object_or_404(Inforsales,SaTradeNum=SaTradeNum)inforsales.SaPayState=1;inforsales.SaState=1;inforsales.payType=ret['payType']inforsales.SaPayTime=datetime.now().strftime('%Y-%m-%d %H:%M:%S');inforsales.SaFinishTime=datetime.now().strftime('%Y-%m-%d %H:%M:%S');inforsales.save();sainfors=inforsales.SaInforssainfors=sainfors.split(',')for item in sainfors:if item.find('"proid":')!=-1:item_index=item.find('"proid":')+8pro_id=int(item[item_index:])pro_id=get_object_or_404(Productions,ProID=pro_id)vendingpro=Vendingpro.objects.filter(ven_id=vendings).filter(pro_id=pro_id)if item.find('"count":')!=-1:item_index=item.find('"count":')+8proNum=int(item[item_index:])vendingpro.update(proNum=vendingpro[0].proNum-proNum);ret=json.dumps(ret)#{'SaTradeNum':"170816505841",'SaPayState':1,'payType':''}return HttpResponse(ret);else:ret=json.dumps(ret)#-------------------------------------------------------------------------->return HttpResponse(ret);else:return HttpResponse('method error');except KeyError:return HttpResponse('no post someone key')def cancel_order(request):#取消订单,客户端timer取消,二维码消失if request.method=="POST":try:token = request.POST.get("token", default='')list = genTokenSeq('', token);venid = list[0];veniddb=get_object_or_404(Vendings,VenID=venid).VenIDif venid == str(veniddb) and venid != '':SaTradeNum = request.POST.get("SaTradeNum", default='000')inforsales=get_object_or_404(Inforsales,SaTradeNum=SaTradeNum)inforsales.SaPayState = 0;inforsales.save();return HttpResponse("订单已取消")except KeyError:return HttpResponse('no post someone key');else:return HttpResponse('method error')def initgoodnum(request):try:token=request.POST.get("token",default='')list=genTokenSeq('',token);token_venid=list[0];venid=get_object_or_404(Vendings,VenID=token_venid).VenIDif request.method=="POST" and token_venid!='' and int(token_venid)==venid:initialize=request.POST.get("initialize",default='')initialize=json.loads(initialize) for key in initialize.keys():if key=="salists":vendings=get_object_or_404(Vendings,VenID=venid)for item in initialize['salists']:Propriceorigin=0.00;Propricepre=0.00;Pronum=0;for key ,value in item.items():if key=='proid':pro_id=get_object_or_404(Productions,ProID=value)vendingpro=Vendingpro.objects.filter(ven_id=vendings).filter(pro_id=pro_id)elif key=='sinPrice':Propriceorigin=float(value)elif key=='toPrice':Propricepre=float(value)else:if key=='count':Pronum=int(value);if Pronum!=0 and Propricepre!=0.00 and Propriceorigin!=0.00 and Pronum<=vendingpro[0].proCount:vendingpro.update(proNum=Pronum,proPriceOrigin=Propriceorigin,proPricePre=Propricepre);return HttpResponse('initalize success')else:return HttpResponse('');else:return HttpResponse('method error');except KeyError:return HttpResponse('no post someone key');def userAction(logtext):ISOTIMEFORMAT='%Y-%m-%d'mkpath='F:\\logtext\\'path=mkpath.strip();path=path.rstrip('\\');ws = xlwt.Workbook(encoding = 'utf-8')sheet = ws.add_sheet(u'logtext')sheet.write(0, 0, '时间')#行,列,名sheet.write(0, 1, '用户行为')row = 1  '''for record in useraction:sheet.write(row,0, record.VenID)sheet.write(row,1,  record.VenName)sheet.write(row,2, record.VenGoodsTotal)sheet.write(row,3, record.VenGoodsNum)sheet.write(row,4, record.Bussin.BussinName)row+=1'''sheet.write(1,0,datetime.now().strftime(ISOTIMEFORMAT))sheet.write(1,1, logtext)exist_file = os.path.exists(path)  if exist_file:  os.remove(path+r"\\logtext.xls")else:os.makedirs(path);ws.save(path+"\\logtext.xls")
tests.py:

#-*- coding:utf-8 -*-from django.test import TestCasefrom django.http import HttpResponsefrom django.urls import reversefrom saler_test import viewsimport jsonclass SalerTestCase(TestCase):def setUp(self):return ;def testCertify(self):response = self.client.post(reverse('saler_test:auth'),{'venid':'123'})self.assertEqual(response.status_code,200)return response.contentdef testHandler(self):response=self.client.post(reverse('saler_test:handler'),{'token':bytes.decode(SalerTestCase.testCertify(self)),'payType':1,'changeType':'','logtext':'','sainfors':'{"salists":[{"proid":2,"name":"农夫山泉","count":1,"sinPrice":1.5,"toPrice":1.5}],"nums":1}','totalPrice':1.5,'venid':'123'})#response=self.client.post(reverse('saler_test:handler'),{'token':bytes.decode(SalerTestCase.testCertify(self)),'payType':0,'changeType':'changeType','logtext':'123','SaTradeNum':'123456',})self.assertEqual(response.status_code, 200)if(json.loads(response.content))['changeType']=='':self.assertEqual(json.loads(response.content),{'SaTradeNum':'123456','payqr':'https://www.baidu.com/ ','code':'1','changeType':''})else:self.assertEqual(json.loads(response.content),{'SaTradeNum':'123456','payqr':'https://www.baidu.com/ ','code':'0','changeType':'changeType'})def testCheckstate(self):response=self.client.post(reverse('saler_test:checkstate'),{'token':SalerTestCase.testCertify(self).decode('utf-8'),'paystate':0,'SaTradeNum':'123456','payType':1})self.assertEqual(response.status_code, 200)if (json.loads(response.content))['SaPayState']==1:print(json.loads(response.content))self.assertEqual(json.loads(response.content),{'SaTradeNum':'123456','SaPayState':1,'payType':'1'})else:self.assertEqual(json.loads(response.content),{'SaTradeNum':'123456','SaPayState':0,'payType':'1'})def testCancel_order(self):response=self.client.post(reverse('saler_test:cancel_order'),{'token':bytes.decode(SalerTestCase.testCertify(self)),'SaTradeNum':'123456'})self.assertEqual(response.status_code, 200)self.assertContains(response,'订单已取消')def testInitgoodnum(self):response=self.client.post(reverse('saler_test:initgoodnum'),{'token':bytes.decode(SalerTestCase.testCertify(self)),'initialize':'{"salists":[{"proid":2,"name":"农夫山泉","count":8,"sinPrice":1.5,"toPrice":12}]}'})self.assertEqual(response.status_code, 200)self.assertContains(response,'initalize success')def testReplenish(self):response=self.client.post(reverse('saler_test:replenish'),{'token':bytes.decode(SalerTestCase.testCertify(self)),'initialize':'{"salists":[{"proid":2,"name":"农夫山泉","count":8,"sinPrice":1.5,"toPrice":12}]}'})self.assertEqual(response.status_code, 200)self.assertContains(response,'initalize success')

urls.py:

from django.conf.urls import url,includefrom django.contrib import adminfrom . import viewsapp_name="saler_test"urlpatterns = [    url(r'^index/$',views.handler, name="handler"),    url(r'^auth/$',views.certify,name="auth"),    url(r'^checkstate/$',views.checkstate, name="checkstate"),    url(r'^initgoodnum/$',views.initgoodnum,name="initgoodnum"),    url(r'^replenish/$',views.initgoodnum,name="replenish"),    url(r'^cancel_order/$',views.cancel_order,name="cancel_order"),]

主项目urls.py:

from django.conf.urls import url,includeurlpatterns = [    url(r'^vd/', include('vd.urls')),    url(r'^runhanght/', include('runhanght.urls')),    url(r'^saler/',include('saler.urls')),    url(r'^saler_test/',include('saler_test.urls')),]
settings.py:

"""Django settings for RunHangTech project.Generated by 'django-admin startproject' using Django 1.11.2.For more information on this file, seehttps://docs.djangoproject.com/en/1.11/topics/settings/For the full list of settings and their values, seehttps://docs.djangoproject.com/en/1.11/ref/settings/"""import os# Build paths inside the project like this: os.path.join(BASE_DIR, ...)BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# Quick-start development settings - unsuitable for production# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!SECRET_KEY = 'oxfrfj)(n2@%u4o#nxgg##c63wub2ui9ytr3q$!hkjnj5@qvel'# SECURITY WARNING: don't run with debug turned on in production!DEBUG = TrueALLOWED_HOSTS = ["*"]# Application definitionINSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'vd',    'runhanght',    'saler',    'saler_test',]MIDDLEWARE = [    'django.middleware.security.SecurityMiddleware',    'django.contrib.sessions.middleware.SessionMiddleware',    'django.middleware.common.CommonMiddleware',    #'django.middleware.csrf.CsrfViewMiddleware',    'django.contrib.auth.middleware.AuthenticationMiddleware',    'django.contrib.messages.middleware.MessageMiddleware',    'django.middleware.clickjacking.XFrameOptionsMiddleware',]ROOT_URLCONF = 'RunHangTech.urls'TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': [BASE_DIR+'/vd/templates/',BASE_DIR+'/vd/templates/vd',BASE_DIR+'/vd/static/',BASE_DIR+'/runhanght/static/',BASE_DIR+'/runhanght/templates/runhanght/',BASE_DIR+'/saler_test/templates/saler_test',],        'APP_DIRS': True,        'OPTIONS': {            'context_processors': [                'django.template.context_processors.debug',                'django.template.context_processors.request',                'django.contrib.auth.context_processors.auth',                'django.contrib.messages.context_processors.messages',            ],        },    },]WSGI_APPLICATION = 'RunHangTech.wsgi.application'# Database# https://docs.djangoproject.com/en/1.11/ref/settings/#databasesDATABASES = {    'default': {'ENGINE': 'django.db.backends.mysql',        'NAME': 'vendings','USER':'root','PASSWORD':'root','HOST':'','PORT':'3306',    }}''''ENGINE': 'django.db.backends.sqlite3',        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),'''''''USER':'admin','PASSWORD':'RHWL6789,','HOST':'192.168.1.76','PORT':'3306',''''''''ENGINE': 'django.db.backends.mysql',        'NAME': 'vendings','USER':'root','PASSWORD':'root','HOST':'','PORT':'3306','''# Password validation# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [    {        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',    },    {        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',    },    {        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',    },    {        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',    },]# Internationalization# https://docs.djangoproject.com/en/1.11/topics/i18n/LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = True#Static files (CSS, JavaScript, Images,)# https://docs.djangoproject.com/en/1.11/howto/static-files/STATIC_URL = '/static/'



原创粉丝点击